我有一個使用imread
函數讀取的圖像。我的目標是在MATLAB中收集圖像中的像素對。具體來說,我讀過一篇論文,並試圖重新創建以下場景:如何在MATLAB上對像素對進行分組
首先,將原始圖像分組爲像素值對。一對由兩個相鄰的像素值組成,或者兩個具有小的差值。配對可以通過將同一行和連續列上的像素或垂直或基於鍵的特定模式配對來水平完成。配對可以通過圖像的所有像素或只是其中的一部分。
我正在尋找重新創建水平配對方案。我不太確定我會如何在MATLAB中做到這一點。
我有一個使用imread
函數讀取的圖像。我的目標是在MATLAB中收集圖像中的像素對。具體來說,我讀過一篇論文,並試圖重新創建以下場景:如何在MATLAB上對像素對進行分組
首先,將原始圖像分組爲像素值對。一對由兩個相鄰的像素值組成,或者兩個具有小的差值。配對可以通過將同一行和連續列上的像素或垂直或基於鍵的特定模式配對來水平完成。配對可以通過圖像的所有像素或只是其中的一部分。
我正在尋找重新創建水平配對方案。我不太確定我會如何在MATLAB中做到這一點。
假設您的圖像是灰度圖,我們可以使用ndgrid
輕鬆生成2D座標網格。我們可以使用這些來創建一個網格,然後將水平座標右移到另一個網格,然後使用sub2ind
將2D網格轉換爲線性索引。我們終於可以使用這些線性索引來創建我們在您的評論中描述的像素配對(您應該將它們添加到您的帖子中)。重要的是,您需要跳過連續的每一列,以確保獨特的像素配對。
我也會假設你的圖像是灰度。如果我們着色,這會稍微複雜一些,我會把它留給你作爲學習練習。因此,如果你的形象是通過imread
讀取並存儲在im
,做這樣的事情:
[rows,cols] = size(im);
[X,Y] = ndgrid(1:rows,1:2:cols);
ind = sub2ind(size(im), X, Y);
ind_shift = sub2ind(size(im), X, Y+1);
pixels1 = im(ind);
pixels2 = im(ind_shift);
pixels = [pixels1(:) pixels2(:)];
pixels
將是一個二維數組,其中每行給你一個具體的配對的像素亮度的圖像。請記住,我獨立處理每一行。因此,只要我們完成了一行,我們只需轉到下一行繼續操作。這也假定您的圖像具有,甚至列數。如果不是,你就有決定。您需要在圖像的最後添加一列,此列可以是任何您想要的,或者您可以在處理之前從圖像中刪除此列。如果要填寫此列,可以將其全部設置爲零,也可以複製最後一列,並將其放在原始圖像的最後一列旁邊。因此,適當的預處理步驟可以看起來像這樣:
if mod(cols,2) ~= 0
im = im(:,1:end-1);
end
上面的代碼簡單地去除圖像中的最後一列,如果列數是奇數。一旦你運行這段代碼,你可以運行我上面的第一個代碼。
祝你好運!
感謝您的幫助。我會嘗試。你很熱情! – 2014-12-03 08:49:34
不客氣。如果我幫忙,考慮接受我的答案。祝你好運! – rayryeng 2014-12-03 15:22:56
你的回答很好。我已經在Matlab中測試過了。非常感謝! – 2014-12-03 18:25:57
請更準確地詢問你的問題。你想在圖像中找到**所有像素**對嗎?像素對的組合總數爲「N *(N-1)/ 2」,其中「N」是圖像中像素的總數。存儲適當大小圖像的所有像素對會使MATLAB快速耗盡內存。例如,一張500 x 500的圖像會生成3.125 x 10^10個可能的圖像像素對。請詳細說明**您想要做什麼**與這些像素對。 – rayryeng 2014-12-02 08:59:24
呃。它只是連續最接近的2個像素。例如:1 2 3 4 5 6 - >(1,2); (3,4); (5,6) – 2014-12-02 10:59:47
如果你有一個奇怪的大小的圖像怎麼辦? '1 2 3 4 5 6 7'。你需要更好地解釋你正在嘗試做什麼,因爲已經有很多圖像處理函數已經內置了這個函數對像素及其鄰域的應用。 (例如'blockproc')。 – nkjt 2014-12-02 13:39:31