2016-10-27 33 views
1

在圖像中製作出圓形ROI後,如何使用腳本從圖像區域獲取信息(平均值,標準差,方差)?如何使用dm腳本從循環ROI獲取信息?

我可以將ciruclar ROI中的位置與原始圖像鏈接起來嗎?

+0

您是指GMS 3功能「橢圓ROI」還是橢圓註釋(也來自以前的GMS版本)? – BmyGuest

+0

你的第二個問題還不清楚。 「鏈接職位」是什麼意思? ROI只是座標的集合。您可以閱讀ROI(即找到中心)並將ROI設置爲某些(即將ROI轉移到某個位置),如果是,請提問。 – BmyGuest

回答

1

不幸的是,這個任務並不像人們希望的那樣簡單直接。

雖然腳本支持將圖像操作限制爲矩形ROI(使用img[]表示法)的方便快捷方式,但對於不規則的ROI,沒有這種功能。

在這種情況下,必須手動創建ROI的二進制掩碼並手動執行想要的操作。本文後面的示例腳本顯示瞭如何計算不規則ROI的平均值。

  • CreateImageWithROI()創建一個測試圖像與在其上兩個ROI
  • GetFirstIrregularROIOfImage()只是返回一個圖像的第一發現,不規則ROI
  • GetROIMean()是實際的示例

命令ROIAddToMask()用於創建面具。注意,也有一個類似的命令,會立即與圖像顯示的所有的ROI執行的操作:ImageDisplayAccumulateROIsToMask()

Irregular masking

到目前爲止,一切都很好。

然而,事實證明,新引進的圓形的ROI還不支持面具創造命令正確(測試與GMS 3.1)。

相反,他們總是用ROI的邊框:

​​

因此,有必要去,即使退一萬步,並宣讀了ROI的座標手動從它創建一個面具。獲取ROI的邊界框並使用橢圓的icolirow表達式創建一個遮罩。在下面的例子:

  • GetFirstOvalROIOfImage()只是返回一個圖像
  • MyAddOvalROIToMask()的第一發現,橢圓形ROI是手動掩模製作爲橢圓形的ROI

Final example


實施例代碼:

image CreateImageWithROI() 
{ 
    // Create and show image 
    number sx = 256, sy = 256 
    image img := RealImage("Image", 4, sx, sy) 
    img = sin(0.1 * iradius) * cos(7 * itheta) 
    img.ShowImage() 

    // Create an irregular, closed ROI 
    ROI myIrRoi = NewROI() 
    myIrRoi.ROIAddVertex(0.3 * sx, 0.1 * sy) 
    myIrRoi.ROIAddVertex(0.7 * sx, 0.2 * sy) 
    myIrRoi.ROIAddVertex(0.5 * sx, 0.6 * sy) 
    myIrRoi.ROIAddVertex(0.1 * sx, 0.8 * sy) 
    myIrRoi.ROISetIsClosed(1) 
    myIRRoi.ROISetVolatile(0) 

    // Create an oval ROI 
    ROI myOvalROI = NewROI() 
    myOvalROI.ROISetOval(0.7 * sy, 0.7 * sx, 0.9 * sy, 0.8 * sx) 
    myOvalROI.ROISetVolatile(0) 

    // AddROIs 
    imageDisplay disp = img.ImageGetImageDisplay(0) 
    disp.ImageDisplayAddROI(myIRRoi) 
    disp.ImageDisplayAddROI(myOvalROI) 

    return img 
} 

ROI GetFirstIrregularROIOfImage(image img) 
{ 
    if (img.ImageIsValid()) 
    { 
     if (0 != img.ImageCountImageDisplays()) 
     { 
      imageDisplay disp = img.ImageGetImageDisplay(0) 
      number nRois = disp.ImageDisplayCountROIs() 
      for (number i = 0; i < nRois; i++) 
      { 
       ROI testROI = disp.ImageDisplayGetRoi(i) 
       number isIrregularClosed = 1 
       isIrregularClosed *= testROI.ROIIsClosed(); 
       isIrregularClosed *= !testROI.ROIIsOval(); 
       isIrregularClosed *= !testROI.ROIIsRectangle(); 
       isIrregularClosed *= (2 < testROI.ROICountVertices()); 
       if (isIrregularClosed) 
        return testROI 
      } 
     } 
    } 
    Throw("No irregular ROI found") 
} 

ROI GetFirstOvalROIOfImage(image img) 
{ 
    if (img.ImageIsValid()) 
    { 
     if (0 != img.ImageCountImageDisplays()) 
     { 
      imageDisplay disp = img.ImageGetImageDisplay(0) 
      number nRois = disp.ImageDisplayCountROIs() 
      for (number i = 0; i < nRois; i++) 
      { 
       ROI testROI = disp.ImageDisplayGetRoi(i) 
       if (testROI.ROIIsOval()) 
        return testROI 
      } 
     } 
    } 
    Throw("No oval ROI found") 
} 

void MyAddOvalROIToMask(image img, ROI ovalROI) 
{ 
    number top, left, bottom, right 
    ovalROI.ROIGetOval(top, left, bottom, right) 
    number sx = (right - left) 
    number sy = (bottom - top) 
    number cx = sx/2 // Used as both center x coordiante and x radius! 
    number cy = sy/2 // Used as both center y coordiante and y radius! 

    // Create mask of just the rect area 
    image maskCut := RealImage("", 4, sx, sy) 
    maskCut = (((cx-icol)/cx)**2 + ((cy-irow)/cy)**2 <= 1) ? 1 : 0 

    // Apply mask to image 
    img[top, left, bottom, right] = maskCut 
} 

number GetROIMean(image img, ROI theRoi) 
{ 
    if (!img.ImageIsValid()) Throw("Invalid image in GetROIMean()") 
    if (!theRoi.ROIIsValid()) Throw("Invalid roi in GetROIMean()") 

    // Create a binary mask of "img" size using the ROI's coordinates 
    image mask = img * 0; // image of same size as "img" with 0 values 
    number sx, sy 
    img.GetSize(sx, sy) 

    // Oval ROIs are not supported by the command correctly 
    // Hence check and compute mask manually.. 
    if (theROI.ROIIsOval()) 
     MyAddOvalROIToMask(mask, theROI) 
    else 
     theROI.ROIAddToMask(mask, 0, 0, sx, sy) 

    if (TwoButtonDialog("Show mask?", "Yes", "No")) 
     mask.ShowImage() 

    // Do meanValue as sums of masked points 
    number maskedPoints = sum(mask) 
    number maskedSum 
    if (0 < maskedPoints) 
     maskedSum = sum(mask * img)/maskedPoints 
    else 
     maskedSum = sum(img) 

    return maskedSum 
} 

Result("\n Testing irregular and oval ROIs on image.\n") 
image testImg := CreateImageWithROI() 
ROI testROIir = GetFirstIrregularROIOfImage(testImg) 
number ROIirMean = GetROIMean(testImg, testROIir) 
Result("\n Mean value (irregular ROI): "+ ROIirMean) 

ROI testROIoval = GetFirstOvalROIOfImage(testImg) 
number ROIovalMean = GetROIMean(testImg, testROIoval) 
Result("\n Mean value (oval ROI)  : "+ ROIovalMean) 
+1

非常感謝您的幫助。我可以在我的數據處理中使用這些提示。 –

+0

順便說一句,同樣的方法也適用於圓形註釋(在GMS 2和更早的版本中),這樣也可以在這種情況下獲得「循環ROI」。 – BmyGuest