簡體   English   中英

在OpenCV中比較強度像素值Vec3b

[英]Compare intensity pixel value Vec3b in OpenCV

我有一個3通道Mat圖像,類型為CV_8UC3 我想在一個循環中將一個像素的強度值與其相鄰像素進行比較,然后如果相鄰像素是否更大,則將其設置為01 我可以得到強度調用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
  • 同樣, SV任何組合都是有效的投影函數,例如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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM