2016-02-04 3 views
0

У меня есть 3-канальное изображение Mat, тип CV_8UC3. Я хочу сравнить в цикле значение интенсивности пикселя со своими соседями, а затем установить 0 или 1, если сосед больше или нет. Я могу получить интенсивность звонка Img.at<Vec3b>(x,y).Сравнить значение пикселя яркости Vec3b в OpenCV

Но мой вопрос: как я могу сравнить два Vec3b?

Должен ли я сравнивать значения пикселей для каждого канала (BGR или Vec3b[0], Vec3b[1] и Vec3b[2]), а затем объединить три канала результатов в единый объект Mat?

+0

Да, вы должны сравнить 3 канала отдельно. –

+0

_intensity_ - это одно значение (и поэтому ваша матрица является одноканальной), а не триггером BGR. Итак, что вы хотите сравнить? – Miki

+0

Я хочу сравнить интенсивность, представленную CV_8UC3. – Franktrt

ответ

0

Me снова :)

Если вы хотите сравнить (более или менее) два RGB значения, которые нужно проецировать 3-мерное пространство RGB на плоскость или оси.

Конечно, есть много возможностей сделать это, но простым способом было бы использовать цветовое пространство HSV. Однако оттенок (H) не подходит в качестве функции линейного порядка, поскольку он является круговым (то есть значение 1.0 идентично 0,0, поэтому вы не можете решить, 0,5> 0,0 или 0,5 < 0,0). Тем не менее, насыщенность (S) или значение (V) являются соответствующими функциями проекционных вашей цели:

  • Если вы хотите иметь цветные пиксели «большие», чем монохромные пиксели, вы займетесь S.
  • Если вы хотите иметь более светлые пиксели, превышающие темные пиксели, вы, вероятно, предпочтете V.
  • Также любая комбинация S и V будет действительной функцией проецирования, например. S+V.
+1

Меня снова: D. Это относится к случаю, когда вы сравниваете отдельные значения, а не триплеты. Поскольку вопрос пока неясен, так как ОП не уточняет конечную цель, я бы подождал немного, прежде чем публиковать некоторые случайные догадки. Подводя итог, этот ответ как-то действителен, но мы фактически не можем знать, отвечает ли этот ответ вопрос. – Miki

+0

Да, я полностью согласен, я только хотел настроить таргетинг на то, что пространство RGB недостаточно структурировано для сравнения значений интенсивности, поэтому в любом случае вам нужно найти другой способ сделать сравнение. – Kornel

+0

И вот почему я не остановился: D. Но ты не ошибешься. Например, если OP пытается получить что-то похожее на Dark Channel Prior, вам нужно работать в пространстве RGB. Но, если вопрос не станет более ясным, мы не сможем сделать многое: D – Miki

0

Насколько я понимаю, вы хотите измерить расстояние/сходство между двумя пикселями Vec3b. Это может быть отражено в общей задаче нахождения расстояния между двумя векторами в n-математическом пространстве.

Одна из известных мер (и я думаю, что это то, о чем вы просите), является евклидовым расстоянием.

Если вы используете OpenCV, то вы можете просто использовать:

cv::Vec3b a(1, 1, 1); 
cv::Vec3b b(5, 5, 5); 
double dist = cv::norm(a, b, CV_L2); 

Вы можете обратиться к this для чтения о сорте :: нормы и ее вариантов.

Редактирование: Если вы делаете это для измерения сходства цветов, рекомендуется использовать цветовое пространство LAB, поскольку доказано, что евклидово расстояние в пространстве LAB является хорошим приближением для восприятия цветов людьми.

Edit 2: Я понимаю, что вы имеете в виду, для этого вы можете получить величину каждого вектора, а затем сравнить их, что-то вроде этого:

double a_magnitude = cv::norm(a, CV_L2); 
    double b_magnitude = cv::norm(b, CV_L2); 
    if(a_magnitude > b_magnitude) 
     // do something 
    else 
     // do something else. 
+0

Смотрите мой комментарий на @Kornel. – Miki

+0

См. Мое второе редактирование. – Baraa

+0

Что касается @Kornel, ответьте, нет ничего плохого. Просто мы теперь не знаем, чего хочет OP. Таким образом, любой ответ может быть правильным или нет. Это просто не стоит отвечать. Отвечая, мы также призываем OP не уточнять вопрос. – Miki

Смежные вопросы