用另一种颜色Matlab替换图像中的某种颜色

时间:2015-02-11 03:34:23

标签: matlab image-processing matlab-figure

我使用imshow在Matlab中打开了一个图像,我希望用新颜色(150,57,80)替换每个像素的颜色(140,50,61)。如果有人可以请告诉我如何做到这一点。

2 个答案:

答案 0 :(得分:2)

假设A是输入图像数据,这可能是一种方法 -

%// Initialize vectors for old and new pixels tuplets
oldval = [140,50,61]
newval = [150,57,80]

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

%// Find out which columns match up with the oldval [3x1] values
matches  = all(bsxfun(@eq,B,oldval(:)),1)
%// OR matches = matches = ismember(B',oldval(:)','rows')

%// 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))

示例运行 -

>> A
A(:,:,1) =
   140   140   140
    40   140   140
A(:,:,2) =
    50    20    50
    50    50    50
A(:,:,3) =
    61    65    61
    61    61    61
>> out
out(:,:,1) =
   150   140   150
    40   150   150
out(:,:,2) =
    57    20    57
    50    57    57
out(:,:,3) =
    80    65    80
    61    80    80

答案 1 :(得分:1)

bsxfun是我解决它的方式。但是,如果您不熟悉它,则可以从图像中提取每个通道,为每个通道使用三个逻辑掩码,并使用logical AND将它们组合在一起。执行AND将在图像中找到那些寻找特定RGB三元组的像素。

因此,我们相应地设置每个通道的输出并重建图像以产生输出。

因此,根据输入图像A,可以执行以下操作:

red = A(:,:,1); green = A(:,:,2); blue = A(:,:,3);
mred = red == 140; mgreen = green == 50; mblue = blue == 61;
final_mask = mred & mgreen & mblue;
red(final_mask) = 150; green(final_mask) = 57; blue(final_mask) = 80;
out = cat(3, red, green, blue);