[英]Compare intensity pixel value Vec3b in OpenCV
我有一個3通道Mat
圖像,類型為CV_8UC3
。 我想在一個循環中將一個像素的強度值與其相鄰像素進行比較,然后如果相鄰像素是否更大,則將其設置為0
或1
。 我可以得到強度調用Img.at<Vec3b>(x,y)
。
但是我的問題是:如何比較兩個Vec3b
?
我應該比較每個通道(BGR或Vec3b[0]
, Vec3b[1]
和Vec3b[2]
)的像素值,然后將三個通道結果合並到一個Mat
對象中嗎?
又是我 :)
如果要比較(大於或小於)兩個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
據我了解,您需要一種措施來計算兩個Vec3b像素之間的距離/相似度。 這可以反映到在n數學空間中找到兩個向量之間的距離這一普遍問題。
歐幾里德距離是著名的量度之一(我想這是您要的)。
如果您使用的是Opencv,則可以簡單地使用:
cv::Vec3b a(1, 1, 1);
cv::Vec3b b(5, 5, 5);
double dist = cv::norm(a, b, CV_L2);
您可以參考它來閱讀有關cv :: norm及其選項的信息。
編輯:如果要執行此操作以測量顏色相似度,建議使用LAB顏色空間,因為它證明LAB空間中的歐幾里得距離可以很好地逼近人類對顏色的感知。
編輯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.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.