我试图在Matlab中仅为图像的一部分着色。例如,我加载一个RGB图像,然后我用Otsu的方法(graythresh
)获得一个掩码。我希望在应用1
im2bw
作为阈值后,仅将颜色保留在值为graythresh
的像素中。例如:
image = imread('peppers.png');
thr = graythresh(image);
bw = im2bw(image, thr);
使用此代码,我获得以下二进制图像:
我的目标是将颜色保持在白色像素中。
谢谢!
答案 0 :(得分:1)
我还有另外一个关于如何替换我们不关心的像素的建议。这通过为bw
图像中存在黑色像素的每个切片创建线性索引来工作。与find
的结果相加是因为bw
是image
的一个“切片”的大小,这就是我们获取其他2个切片的索引的方式。
启动MATLAB 2016b:
image(find(~bw)+[0 numel(bw)*[1 2]]) = NaN;
旧版本:
image(bsxfun(@plus,find(~bw),[0 numel(bw)*[1 2]])) = NaN;
然后imshow(image)
给出:
请注意NaN
转换为integer classes的0
。
在澄清其他像素应保持灰色版本后,请参阅以下代码:
% Load image:
img = imread('peppers.png');
% Create a grayscale version:
grayimg = rgb2gray(img);
% Segment image:
if ~verLessThan('matlab','9.0') && exist('imbinarize.m','file') == 2
% R2016a onward:
bw = imbinarize(grayimg);
% Alternatively, work on just one of the color channels, e.g. red:
% bw = imbinarize(img(:,:,1));
else
% Before R2016a:
thr = graythresh(grayimg);
bw = im2bw(grayimg, thr);
end
output_img = repmat(grayimg,[1 1 3]);
colorpix = bsxfun(@plus,find(bw),[0 numel(bw)*[1 2]]);
output_img(colorpix) = img(colorpix);
figure; imshow(output_img);
仅使用红色通道进行二值化时的结果:
答案 1 :(得分:0)
你的问题错过"并用黑色"替换其余部分。这有两种方式:
紧凑型解决方案:使用bsxfun
:
<script>
$( "#text" ).hover(
function() {
$( this ).append( $( "<span>Climate change: 'Monumental' deal to cut HFCs, fastest growing greenhouse gases</span>" ) );
}, function() {
$( this ).find( "span:last" ).remove();
}
);
</script>
虽然我很高兴看到前一个,但你也可以看看这个循序渐进的方法:
newImage = bsxfun(@times, Image, cast(bw, 'like', Image));
哪个可以为黑色区域提供不同的替代品:
根据评论,% separate the RGB layers:
R = image(:,:,1);
G = image(:,:,2);
B = image(:,:,3);
% change the values to zero or your desired color wherever bw is false:
R(~bw) = 0;
G(~bw) = 0;
B(~bw) = 0;
% concatenate the results:
newImage = cat(3, R, G, B);
的{{1}}区域应替换为相同输入的灰度图像。这是如何实现它的:
false
结果如下: