2016-02-16 45 views
2

我必須更改RGB圖像中的像素值。 我有兩個陣列指示位置,所以:更改RGB圖像中多個像素的值

rows_to_change = [r1, r2, r3, ..., rn]; 
columns_to_change = [c1, c2, c3, ..., cn]; 

我沒有循環操作此修改。因此,直觀地說,爲了在那些位置設置紅色,我寫道:

image(rows_to_change, columns_to_change, :) = [255, 0, 0]; 

此代碼行返回錯誤。

如何在不使用double for循環的情況下操作此更改?

+0

'image(rows_to_change,columns_to_change,:)'索引你想要的所有像素嗎?這樣你也像索引像素(r1,c2,:),這是打算? – Daniel

+0

我會''圖像(r1,c1,:)= [255,0,0]'; 'image(r2,c2,:)= [255,0,0]';直到'image(rn,cn,:)= [255,0,0]'。 – Alessandro

回答

3

您可以使用sub2ind這一點,但它更容易每通道的工作:

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

轉換你的行和列索引(即下標索引)線性指標(每2D頻道):

idx = sub2ind(size(red),rows_to_change,columns_to_change) 

設置每個通道的顏色:

red(idx) = 255; 
green(idx) = 0; 
blue(idx) = 0; 

Concatenat Ë通道中,形成彩色圖像:

new_image = cat(3,red,green,blue) 
+0

沒有單獨的渠道沒有辦法? – Alessandro

+0

@Alessandro它會是一團糟,但可能使用'permute'。然而,你有一個有限的(非常小的)和固定數量的通道,所以把它們分開是個不錯的選擇。如果您需要多次執行此操作,請將其封裝在一個函數中。 – Dan

+0

好的,謝謝!有用。 – Alessandro

1

如果你真的不想分開的渠道,你能給我們這樣的代碼,但它肯定是更復雜的做這種方式:

%your pixel value 
rgb=[255, 0, 0] 
%create a 2d mask which is true where you want to change the pixel 
mask=false(size(image,1),size(image,2)) 
mask(sub2ind(size(image),rows_to_change,columns_to_change))=1 
%extend it to 3d 
mask=repmat(mask,[1,1,size(image,3)]) 
%assign the values based on the mask. 
image(mask)=repmat(rgb(:).',numel(rows_to_change),1) 

我最初提出這個想法的主要原因是圖像的可變數量的通道。

+0

我會嘗試這個選項。實際上,分離三個頻道似乎更加複雜。 – Alessandro