<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />如何辨識 .jpeg 圖片上具有非常相似顏色(例如灰色)的像素組?
我想你可以採取幾種不同的方法來解決這個問題。 我的一個問題是,您是否正在尋找一種特定的顏色(例如灰色),或者您是否正在尋找對於任何給定的像素,該像素顏色是否(緊密)與周圍的像素匹配? 我認為您正在詢問第一種情況,即搜尋一種“目標”顏色。 另一個問題是你是否總是在尋找灰色,或者目標顏色會改變。 我問的原因是因為顏色是由紅、綠、藍三種成分組成。 但是你可以將 rgb 轉換為灰階影像,然後你就只有一個元件,這將使程式碼更簡單。 我假設您正在處理彩色圖像,尋找非灰色。 如果不是這種情況,您可以簡化程式碼。
我認為這是一種非常適合您的方法。 我們將讀取來源影像,建立一個目標影像,即您正在尋找的目標顏色,然後我們將從另一個影像中減去一個影像。 然後我們可以查看結果,尋找「相同」容差範圍內的任何像素。
首先,您需要讀取影像並取得三個(紅色、綠色和藍色)矩陣的像素值。
imgSource = NewImage("$Sample_Images\黑犀牛足跡.jpg");
{ rSource, gSource, bSource } = imgSource << getPixels("rgb");
win = newWindow("來源映像", imgSource);
接下來,定義您要符合的目標顏色。 我將為此範例建立灰色,但您可以指定任何值(0.0 - 1.0 之間)。
r值=0.5;
g值=0.5;
b值=0.5;
現在讓我們建立新的矩陣來表示我們的目標彩色影像。 這些矩陣應與來源影像大小相同,以目標顏色作為值。
{ wd, ht } = imgSource << getSize();
rTarget = J(ht, wd, rValue);
gTarget = J(ht, wd, gValue);
bTarget = J(ht, wd, bValue);
現在讓我們從另一個中減去一個(對於每個顏色分量)。
rDiff = abs(rSource - rTarget);
gDiff = abs(gSource - gTarget);
bDiff = abs(bSource - bTarget);
現在我們將定義我們的容忍度。 這就是我們認為「相同」的程度。 可以說 2% 之內就已經夠接近了。
公差=0.02;
現在我們可以迴圈遍歷差異矩陣,找出哪些值小於容差。 有兩種方法可以做到這一點。 一種方法是查看 r、g 和 b,看看這三個值是否都小於容差。 另一種方法是將三個差異矩陣組合成一個強度(灰階)矩陣,然後只查看每個像素的一個強度值。 我個人比較喜歡這種方法。 所以我要先轉換為灰階矩陣。
意向 = 0.30*rDiff + 0.59*gDiff + 0.11*bDiff;
現在,我將循環遍歷強度矩陣,將每個值與容差進行比較。
對於 (y = 1, y <= ht, y++,
對於 (x = 1, x < wd, x++,
if (意圖[y,x] < 容差,
// 找到一個“相同”的像素,讓其在原始中變為“紅色”,以便它顯示出來
rSource[y,x] = 1.0;
gSource[y,x] = 0.0;
b源[y,x] = 0.0;
);
);
);
現在讓我們將新值設定回原始影像,以便我們可以看到我們找到的像素
imgSource << setpixels("rgb", {rSource, gSource, bSource});
這就是全部!:)
同樣,如果您正在處理灰階影像並蒐索灰階值,事情會變得更容易,因為對於來源和目標,我們只使用一個矩陣而不是 3 個矩陣。
您可能想查看我放在文件交換中的一些圖像示例。 文件,映像範例.jsl和影像差異.jsl可能是最有用的。 另外,我有一些部落格文章討論對圖像進行顏色分析,例如大象腳的影像分析。
我希望這有幫助!
約翰