Java OpenCV 在 inRange 之后将 HSV 转换回 BGR

我想创建一个依赖 HSV 过滤的黑白图像。然而,在将图像从 BGR 转换为 HSV 并应用该inRange()方法后,该矩阵被简化为单通道矩阵(值为0或255)并且无法转换回 BGR。


有没有简单的方法来解决这个问题?我什至需要反向转换的步骤,还是可以以某种方式显示带有我所拥有信息的新图像?我对 OpenCV还很陌生,并且已经发现了一个非常相似的问题,但我仍然对该怎么做感到困惑。


例子:


System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

Mat img = Imgcodecs.imread(path);

Mat hsv = new Mat();

Mat img_new = new Mat(); 


Imgproc.cvtColor(img,hsv,Imgproc.COLOR_BGR2HSV);

Core.inRange(hsv, new Scalar(hue,saturation,value),new Scalar(hue,saturation,value),hsv);

Imgproc.cvtColor(hsv, img_new, Imgproc.COLOR_HSV2BGR); // This line doesn't work.


// display new image in JFrame

MatOfByte mob = new MatOfByte();

Imgcodecs.imencode(".tif", img_new, mob);

byte ba[] = mob.toArray();

BufferedImage bi = ImageIO.read(new ByteArrayInputStream(ba));

newImgLabel.setIcon(new ImageIcon (bi));


茅侃侃
浏览 342回答 1
1回答

呼啦一阵风

inRange 函数为您提供了一个蒙版(实际上是一个值为 0 和 255 的单通道图像),您可以使用它来选择要选择的区域。Mat mask = new Mat();Imgproc.cvtColor(img,hsv,Imgproc.COLOR_BGR2HSV);Core.inRange(hsv, new Scalar(hue,saturation,value),new Scalar(hue,saturation,value),mask);img.copyTo(img_new, mask);
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java