Я хочу создать черно-белое изображение, полагаясь на фильтрацию 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));
Заранее спасибо!




Функция 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);
Это работает как шарм - большое спасибо! Обновлено: чтобы получить черно-белое изображение, я сделал следующее:
Mat template = img.clone(); template.setTo(new Scalar(255,255,255)); template.copyTo(img_new, mask);