2015-02-11 106 views
0

如何替換具有某個RGB範圍的像素,而不僅僅是如question中所示的特定值,例如R範圍爲140-150的像素,G範圍從50-55和B的範圍從61-70,另一個單值如(150,57,80)。如果有人可以請指教。用另一種顏色替換圖像中的某個顏色範圍Matlab

+0

另外,請註明如果他們是由一個單一的連音被取代? – Divakar 2015-02-11 04:44:50

+0

什麼是單連音符? – Tak 2015-02-11 04:45:54

+0

就像它們被單像素彩色信息所取代一樣,比如'(150,57,80)'? – Divakar 2015-02-11 04:46:38

回答

4

這也是我在之前發佈的其他問題中提供的答案的修改。您只需更改logical掩模計算,以便我們搜索一系列紅色,綠色和藍色值。

這樣:

red = A(:,:,1); green = A(:,:,2); blue = A(:,:,3); 

%// Change here 
mred = red >= 140 & red <= 150; 
mgreen = green >= 50 & green <= 55; 
mblue = blue >= 61 & blue <= 70; 

%// Back to before 
final_mask = mred & mgreen & mblue; 
red(final_mask) = 150; green(final_mask) = 57; blue(final_mask) = 80; 
out = cat(3, red, green, blue); 
2

原來你需要做一些修改,找到合適的匹配像素位置。這裏的實現 -

%// Initialize vectors for the lower and upper limits for finding suitable 
%// pixels to be replaced 
lower_lim = [140,50,61] 
upper_lim = [150,55,70] 

%// Initialize vector for new pixels tuplet 
newval = [150,57,80] 

%// Reshape the input array to a 2D array, so that each column would 
%// represent one pixel color information. 
B = reshape(permute(A,[3 1 2]),3,[]) 

%// Find out which columns fall within those ranges with `bsxfun(@ge` and `bsxfun(@le` 
matches = all(bsxfun(@ge,B,lower_lim(:)) & bsxfun(@le,B,upper_lim(:)),1) 

%// Replace all those columns with the replicated versions of oldval 
B(:,matches) = repmat(newval(:),1,sum(matches)) 

%// Reshape the 2D array back to the same size as input array 
out = reshape(permute(B,[3 2 1]),size(A)) 
相關問題