簡體   English   中英

opencv java 中的掩碼圖像

[英]Mask image in opencv java

我需要將接近白色的像素轉換為白色,將接近黑色的像素轉換為黑色。

我在 python 中找到了有關如何執行此操作的代碼片段。

hsv=cv.cvtColor(image,cv.COLOR_BGR2HSV)
# Define lower and upper limits of what we call "brown"
brown_lo=np.array([10,0,0])
brown_hi=np.array([20,255,255])
# Mask image to only select browns
mask=cv.inRange(hsv,brown_lo,brown_hi)
# Change image to red where we found brown
image[mask>0]=(0,0,255)

我已將其轉換為 java,如下所示。

Mat temp= new Mat();
Imgproc.cvtColor(src,temp,COLOR_BGR2HSV);
Scalar low= new Scalar(10,0,0);
Scalar high= new Scalar(20,255,255);
Mat mask = new Mat();
inRange(temp,low,high,mask);

但是我在將以下語句轉換為 java 時遇到問題,並且 java 中沒有好的 opencv 文檔和示例。

image[mask>0]=(0,0,255)

有人可以幫助如何將上述語句轉換為 java ...?

我試過 setTo 但它沒有給出想要的行為(下面附上截圖)。 有關預期結果,請參閱https://stackoverflow.com/a/50215020/12643143

src.setTo(new Scalar(0,0,255),mask);

我建議使用setTo() 此方法可以設置Mat中的所有像素。 如果指定了可選的掩碼參數,則將設置掩碼中具有非零值的對應像素的所有像素。

因此 python 語句

image[mask>0]=(0,0,255)

可以在 Java 中替換為:

image.setTo(new Scalar(0, 0, 255), mask);

其中image必須是Mat object。

回答問題

正如@Rabbid76 提到的, setTo是正確的方法。 但是,如果您想要特定的邏輯,例如image[mask>127]=(0,0,255) ,則執行閾值( Imgproc.threshold(grey,grey, 127, 255, THRESH_BINARY); ),然后使用setTo

解決我的問題

其實我的問題不是由於setTo 這是我在代碼中讀/寫 Mat 的方式與我提到的帖子之間的邏輯不匹配。

我正在發布我遇到的問題的解決方案,以便它可以幫助像我這樣的新蜜蜂。

讀取圖像的問題

該帖子使用Imgcodecs.imread()以 BGR 格式將圖像讀取到 Mat 中。

而我正在使用bitmapToMat類型的CV_8UC4加載 bitmap,如下所示,它將圖像以 RGBA 格式讀取到 Mat。

Mat src = new Mat(bitmap.getHeight(), bitmap.getWidth(), CV_8UC4);
org.opencv.android.Utils.bitmapToMat(bitmap, src);

修復是正確轉換格式。

Mat src = new Mat(bitmap.getHeight(), bitmap.getWidth(), CV_8UC3); //notice 3 channel
org.opencv.android.Utils.bitmapToMat(bitmap, src);
Imgproc.cvtColor(src,hsv,COLOR_RGB2HSV); //Convert RGB to HSV. COLOR_RGBA2HSV not exist, hence we load it in CV_8UC3(3 channel R,G,B).

寫圖有問題

類似地,由於我們在bitmapToMatimread之間的讀取存在差異,因此同樣適用於寫入。 Imgcodecs.imwrite()會將 BGR 圖像寫入 bitmap,因為我必須將其轉換回 RGB 格式以便matToBitmapImgproc.cvtColor(rgb, rgb, Imgproc.COLOR_BGR2RGB);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM