Я создал процесс, который выполняет некоторые трюки с изображением, чтобы оно выглядело лучше. Один из шагов — размыть канал hue
на изображении HSV
. Для размытия канала я использую cv::blur
.
Проблема в том, что hue
имеет круглую форму, поэтому в некоторых случаях, когда у меня есть значения 0
и 179
, размытие дает результаты около 40-80.
Я пробовал использовать Lab
, но это работает не так хорошо, как с HSV
.
Как разместить cv::bulr
на канале hue
и сохранить его круглую форму?
@CrisLuengo Крис, не могли бы вы написать это как правильный ответ, пожалуйста?
похоже, тип YUV подойдет больше. UV-плоскость — это та же плоскость, что и диапазон оттенка и насыщенности (плюс-минус).
Сглаживающий фильтр, такой как 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 и т. д. также могут быть хорошими цветовыми пространствами для работы, в зависимости от цели обработки. Все это отделяет яркость (интенсивность, яркость, что там у вас) от цветности.
Спасибо, что так подробно все расписали.
@MarkSetchell Только потому, что ты так мило попросил. :)
Спасибо @CrisLuengo за отличный ответ и @MarkSetchell за то, что привели к этому ответу. Размытие канала оттенка с помощью вышеуказанного решения работает отлично. Кроме того, я попробовал использовать цветовое пространство XYZ
(CIE XYZ), и это работает с моим кодом, поэтому я буду использовать его вместо размытия оттенка.
@Raffallo XYZ — это просто вращение RGB, где Y проходит по черно-белой диагонали куба RGB. В Yxy вы получаете два истинных канала цветности. Не знаю, в чем разница для вашего приложения, но если работа в XYZ дает хорошие результаты, то отлично! В конце концов, конвертировать из RGB в XYZ дешевле. :)
Вычислите
a=S*cos(H)
иb=S*sin(H)
, размойте эти два канала, а затем вычислите H обратно из результата. Хотя HSV на самом деле бесполезен для обработки изображений, он был разработан, чтобы позволить пользователю выбирать цвет.