NI產品與技術 討論區

取消
顯示結果 
搜尋替代 
您的意思是: 

threshold

已解決!
前往解決方案

我想得到如图一那样的二值化效果,包含灰度元素,而不是图二中的只有二值元素的图像。就像National Instruments Vision Assistant 里面的工具的效果,请教大家有说明办法可以实现吗?

0 積分
1 條訊息(共 11 條)
8,950 檢視

开发环境:vs net c#

软件:Vision Assistant 2010

 

0 積分
2 條訊息(共 11 條)
8,948 檢視

您好

 

若是要呈現與Vision Assistant一樣的顯示方式的話,可以使用Overlay的功能。

先將影像用二值化的函式進行處理,接著再使用overlay將處理完的影像覆蓋在原始的影像上。

您可以試看看,謝謝。

0 積分
3 條訊息(共 11 條)
8,901 檢視

非常感謝您的回復:

您的意思是把threshold的圖像上的點通過迴圈搜索出來再通過overlay.addPoint 畫在原始圖像上嗎?這個方式我試了,速度太慢了,似乎不行啊。

或者是其他什麼方法嗎?請多多指教了,非常感謝!

 

0 積分
4 條訊息(共 11 條)
8,894 檢視
您好 或者可以試試看這個方法。先將二質化的圖跟"1"做exclusive or,那麼1就會變成0、0就會變成1。再用此圖去跟原始的灰階圖檔做相乘,乘出來的圖檔在原本二質化圖檔中pixel為1的地方,在灰階圖檔的位置pixel的值就會變成0,也就是會變成黑色。 再用此圖檔跟二質化圖檔相加,原本灰階的值因為跟0相加就會被保存,而0的部分則會變成1,也就是紅色,依此去達到您要的效果。謝謝。
0 積分
5 條訊息(共 11 條)
8,882 檢視

hi penguinjazzy

 

很高兴得到您的回复, 我按照您的方法做了一下,发现有一个问题:

我想得到的那种效果,一半是需要灰度图像,一半又是需要二值化的图像;我的显示框体只能选择显示其中之一;PaletteType.Gray(灰度平台)和PaletteType.Binary(二值化平台)两个平台。

得到的图像很是奇怪啊,我把照片传了上来,您再帮我看一下吧,有没什么办法解决。

 

0 積分
6 條訊息(共 11 條)
8,872 檢視
解決方案
由主題作者所接受 McLovin

您好

 

    若是如此. 那您可能得把所有的影像從U8轉成U32來做處理。  也就是在二質化完後將U8的0和1 先做exclusive or後再轉成U32的0跟1。 跟著再將原始圖檔 (RGBU32) 做相乘, 將需要填色的地方先清成0  (假設此為圖A)。 另外再用原本的二質化1和0的影像,將其轉成U32的1和0後,乘上紅色RGB值 (此值為16711680), 如此就做出了一個在原本二質化圖像上值為1的位置上 轉換為RGBU32後相對應位置也是紅色的圖像 (假設此圖為B) 。 將圖A和圖B相加就可以得到你要的效果。 我在LabVIEW上用此方式做是可以work的,我將做完的圖檔放在附件檔案供您參考。謝謝您。

0 積分
7 條訊息(共 11 條)
8,843 檢視

HI penguinjazzy

再次感謝您的回復:

我按照您的方法試了,我用的是c# vs2008,不過方法和labview應該是一樣的;

以下是我的方法:

1、 Algorithms.Threshold(imageViewer1.Image, imageViewer2.Image, new Range(110, 255), true, 1);這個是將原始圖像做二值化處理放在imageViewer2.Image

 

2、 imageViewer1.Image.Type = ImageType.Rgb32;
            imageViewer2.Image.Type = ImageType.Rgb32; 將兩幅圖像都轉換成rgb32位(我這只是改變了圖像的類型,沒有找到將U8轉換成RGB32的圖像的函數,不知道可以不可以)//如果您用Labview有轉換函數請寫我看下,我看下C#裡有沒類似的函數

 

3、    Algorithms.Multiply(imageViewer1.Image, imageViewer2.Image, imageViewer1.Image);//原始圖像和二值圖像相乘放在imageViewer1.Image

 

4、Algorithms.Multiply(imageViewer2.Image, new PixelValue(Rgb32Value.RedColor), imageViewer2.Image);//二值化的圖像乘以紅色RGB值結果放在 imageViewer2.Image

 

5、Algorithms.Add(imageViewer1.Image, imageViewer2.Image, imageViewer2.Image);  將2個圖像相加 結果放在 imageViewer2.Image

 

得到的結果和您上傳的圖片差距很大,可是找不出問題在哪裡;

penguinjazzy兄,希望能夠再次得到您的幫助,萬分感謝!

0 積分
8 條訊息(共 11 條)
8,836 檢視

您好

 

   我看了您的步驟, 似乎是少了一步 "將二質化圖片先做exclusive-or" - > 轉成U32 Array -> 跟原始圖片(也先轉成U32 Array)相乘存起來  (您似乎是直接將二質化圖形轉U32後去做相乘) 。 函數部分, LabVIEW中也沒有將U8轉成RGB的函數, 我只是將圖形以U8 Array的方式做成現, 直接將U8做資料型態轉換成U32 (值不變) , 後面都是以U32 Array的方式在做運算。  Algorithms.Multiply 和  Algorithms.Add在labVIEW中也有相對應的function,不過我並沒有用到,我用到的都是Array的運算式,運算完後再轉成圖片方式做呈現。 另外建議您在做運算時,可以先將新運算出來的資料存在新的記憶體空間,以確保不會用到舊的值,等確認步驟沒錯後,再做程式碼優化步驟。

 

PS:  就您的圖形來看,還有可能有問題的地方在於二質化圖像乘上紅色RGB這個步驟,請確保二質化圖像中值為1的地方皆變成16711680,0的地方還是為0,如此相加時才不會覆蓋到該保留原本顏色的地方。

 

上供您參考,謝謝。

0 積分
9 條訊息(共 11 條)
8,808 檢視

Hello penguinjazzy 

再次感谢您的回复:

今天我又试了试您说的方法,并且把所有的变量都分别放置了,应该没有乱, "將二質化圖片先做exclusive-or" 这一步,上回我没有copy到回复里面来,其实是有做这样的动作的。

 

   Algorithms.Threshold(originalImage, thresholdImage,
                 new Range(trackBar1.Value, 255), true, 1);          原始图像的二值化放在thresholdImage

 

// Operators: XOR Constant
             PixelValue vaPixelValue = SetPixelValue(thresholdImage.Type, 1, 0, 0, 0);
             Algorithms.Xor(thresholdImage, vaPixelValue, exclusiveorImage);
             exclusiveorImage.Type = ImageType.Rgb32;  //二值化图像做 exclusive or处理放在exclusiveorImage

 

   originalImage.Type = ImageType.Rgb32;
             originalXexclusiveorImage.Type = ImageType.Rgb32;
             // Operators: Multiply Image
             Algorithms.Multiply(originalImage, exclusiveorImage, originalXexclusiveorImage);//exclusive or后的图像乘以原始图像放在originalXexclusiveorImage

 

 

   exclusiveorXRedImage.Type = ImageType.Rgb32;
             Algorithms.Multiply(exclusiveorImage, new PixelValue(Rgb32Value.RedColor), exclusiveorXRedImage);//exclusive or的图像乘以红色像素放在exclusiveorXRedImage

 

 MixedImage.Type = ImageType.Rgb32;
             Algorithms.Add(exclusiveorXRedImage, originalXexclusiveorImage, MixedImage);//exclusiveorXRedImage加上originalXexclusiveorImage图像 放在MixedImage
 

MixedImage就是按照您的方法完成的最终图像。

 

方法的话应该就是这样了,错误的地方可能就是那个U8转U32的过程了,具体的我也不知道错在哪里,请您再帮忙看一看这个问题。

 

图像见附件:

 


           原始图像  二值化图像 融合后图像
 

0 積分
10 條訊息(共 11 條)
8,793 檢視