我想依靠HSV过滤创建黑白图像。但是,在将图像从BGR转换为HSV并应用inRange()
方法之后,该矩阵被简化为单通道矩阵(其值为0
或255
)并且无法转换回到BGR。
是否有解决此问题的简便方法?我是否甚至需要进行反向转换的步骤,还是可以以某种方式显示包含我所拥有信息的新图像?我是OpenCV的新手,已经找到了very similar question,但对于执行该操作还是有些困惑。
示例:
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));
提前谢谢!
答案 0 :(得分:0)
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);