Java OpenCV конвертирует HSV обратно в BGR после inRange

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

Заранее спасибо!

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
537
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);

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

user4429422 02.08.2018 09:00

Другие вопросы по теме