Размытие канала OpenCV Hue

Я создал процесс, который выполняет некоторые трюки с изображением, чтобы оно выглядело лучше. Один из шагов — размыть канал hue на изображении HSV. Для размытия канала я использую cv::blur. Проблема в том, что hue имеет круглую форму, поэтому в некоторых случаях, когда у меня есть значения 0 и 179, размытие дает результаты около 40-80. Я пробовал использовать Lab, но это работает не так хорошо, как с HSV.

Как разместить cv::bulr на канале hue и сохранить его круглую форму?

Вычислите a=S*cos(H) и b=S*sin(H), размойте эти два канала, а затем вычислите H обратно из результата. Хотя HSV на самом деле бесполезен для обработки изображений, он был разработан, чтобы позволить пользователю выбирать цвет.

Cris Luengo 23.06.2024 21:35

@CrisLuengo Крис, не могли бы вы написать это как правильный ответ, пожалуйста?

Mark Setchell 24.06.2024 00:50

похоже, тип YUV подойдет больше. UV-плоскость — это та же плоскость, что и диапазон оттенка и насыщенности (плюс-минус).

Christoph Rackwitz 24.06.2024 08:36
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Сглаживающий фильтр, такой как cv::blur, представляет собой (взвешенную) операцию среднего. Чтобы вычислить среднее значение углов, обычно используют усреднение единичных векторов с заданным углом. То есть мы преобразуем каждое значение phi в пару (cos(phi),sin(phi), усредняем пары, а затем вычисляем угол результата (используя atan2 для сохранения квадранта)

Мы можем сделать то же самое при размытии изображения, кодирующего углы, например канала оттенка изображения HSV. Просто вычислите два изображения a=cos(H) и b=sin(H), размойте каждое изображение и, наконец, вычислите H=atan2(b,a) с этими размытыми изображениями.

В HSV пиксели с нулевой насыщенностью имеют бессмысленный оттенок. Когда насыщенность низкая, оттенок менее точный. Это также должно быть менее важно при усреднении. Итак, мы можем взвесить средние значения с помощью S. Для этого вычислите a=S*cos(H) и b=S*sin(H). Остальное остается прежним.


Но учтите, что HSV не совсем подходит для обработки изображений. Первоначально HSV был разработан, чтобы позволить пользователю выбирать цвет в графическом интерфейсе программы рисования. Другие цветовые пространства более подходят. Вы можете использовать, например, CIE Yxy, где Y — яркость, а xy — два компонента цветности. Yxy — это линейная версия Lab, которая не пытается быть единообразной по восприятию. Каналы x и y могут быть просто размыты (угол между ними сравним с H, а норма — с S). CIE Lab, CIE Luv, OKLab и т. д. также могут быть хорошими цветовыми пространствами для работы, в зависимости от цели обработки. Все это отделяет яркость (интенсивность, яркость, что там у вас) от цветности.

Спасибо, что так подробно все расписали.

Mark Setchell 24.06.2024 07:40

@MarkSetchell Только потому, что ты так мило попросил. :)

Cris Luengo 24.06.2024 08:18

Спасибо @CrisLuengo за отличный ответ и @MarkSetchell за то, что привели к этому ответу. Размытие канала оттенка с помощью вышеуказанного решения работает отлично. Кроме того, я попробовал использовать цветовое пространство XYZ (CIE XYZ), и это работает с моим кодом, поэтому я буду использовать его вместо размытия оттенка.

Raffallo 24.06.2024 10:01

@Raffallo XYZ — это просто вращение RGB, где Y проходит по черно-белой диагонали куба RGB. В Yxy вы получаете два истинных канала цветности. Не знаю, в чем разница для вашего приложения, но если работа в XYZ дает хорошие результаты, то отлично! В конце концов, конвертировать из RGB в XYZ дешевле. :)

Cris Luengo 24.06.2024 15:42

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