用另一种颜色替换图像中的特定颜色范围 Matlab
Replace a certain color range in an image with another color Matlab
如何替换具有特定 RGB 范围的像素,而不仅仅是此 中显示的特定值,例如 R 范围为 140-150、G 范围为 50-55 和 B 范围的像素从 61-70 ,另一个单一值如 (150,57,80)。如果有人可以请指教。
事实证明,您只需进行少量修改即可找到合适的匹配像素位置。这是实现 -
%// 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))
这也是我在您之前发布的另一个问题中提供的答案的修改。您只需更改 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);
如何替换具有特定 RGB 范围的像素,而不仅仅是此
事实证明,您只需进行少量修改即可找到合适的匹配像素位置。这是实现 -
%// 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))
这也是我在您之前发布的另一个问题中提供的答案的修改。您只需更改 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);