开发环境:vs net c#
软件:Vision Assistant 2010
在 06-19-2011 09:15 PM
您好
若是要呈現與Vision Assistant一樣的顯示方式的話,可以使用Overlay的功能。
先將影像用二值化的函式進行處理,接著再使用overlay將處理完的影像覆蓋在原始的影像上。
您可以試看看,謝謝。
非常感謝您的回復:
您的意思是把threshold的圖像上的點通過迴圈搜索出來再通過overlay.addPoint 畫在原始圖像上嗎?這個方式我試了,速度太慢了,似乎不行啊。
或者是其他什麼方法嗎?請多多指教了,非常感謝!
在 06-23-2011 02:44 AM
hi penguinjazzy
很高兴得到您的回复, 我按照您的方法做了一下,发现有一个问题:
我想得到的那种效果,一半是需要灰度图像,一半又是需要二值化的图像;我的显示框体只能选择显示其中之一;PaletteType.Gray(灰度平台)和PaletteType.Binary(二值化平台)两个平台。
得到的图像很是奇怪啊,我把照片传了上来,您再帮我看一下吧,有没什么办法解决。
在 06-27-2011 09:28 PM
您好
若是如此. 那您可能得把所有的影像從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的,我將做完的圖檔放在附件檔案供您參考。謝謝您。
06-28-2011 09:43 AM - 已編輯 06-28-2011 09:45 AM
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兄,希望能夠再次得到您的幫助,萬分感謝!
在 06-29-2011 09:15 PM
您好
我看了您的步驟, 似乎是少了一步 "將二質化圖片先做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,如此相加時才不會覆蓋到該保留原本顏色的地方。
上供您參考,謝謝。
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的过程了,具体的我也不知道错在哪里,请您再帮忙看一看这个问题。
图像见附件:
原始图像 二值化图像 融合后图像