为什么我不能从原始图像中为我的分割区域着色

问题描述 投票:1回答:2

我有以下代码:

close all;
star = imread('/Users/name/Desktop/folder/pics/OnTheBeach.png');

blrtype = fspecial('average',[3 3]);
blurred = imfilter(star, blrtype);

[rows,cols,planes] = size(star);
R = star(:,:,1); G = star(:,:,2); B = star(:,:,3);
starS = zeros(rows,cols);
ind = find(R > 190 & R < 240 & G > 100 & G < 170 & B > 20 & B < 160);
starS(ind) = 1;

K = imfill(starS,'holes');

stats = regionprops(logical(K), 'Area', 'Solidity');
ind = ([stats.Area] > 250 & [stats.Solidity] > 0.1);
L = bwlabel(K);
result = ismember(L,find(ind));

到目前为止,我加载了一个图像,模糊以过滤掉一些噪点,进行颜色分割以找到落在该范围内的特定对象,然后为对象的颜色创建一个值为1的二进制图像,为所有其他东西创建0 。最后,我进行了区域过滤,以消除图像中留下的任何杂乱,因此我只剩下我正在寻找的对象。

object I was looking for in original image

现在我想基于分割蒙版重新着色原始图像以改变海星的颜色。我想创建红色,绿色,蓝色通道,为它们赋值,然后在图像上放置遮罩。 (以红色海星为例)

red = star;
red(starS) = starS(:,:,255);
green = star;
green(starS) = starS(:,:,0);
blue = star;
blue(starS) = star(:,:,0);
out = cat(3, red, green, blue);
imshow(out);

这给了我一个错误:索引超出矩阵维度。

Project4中的错误(第28行)red(starS)= starS(:,:,255);

我目前的做法有什么问题?

matlab image-segmentation
2个回答
2
投票

你的代码有点令人困惑......我不明白你想要使用的面具是starS还是result,因为它们看起来都像是2d索引器。在您的第二个代码段中,您使用了starS,但您在问题中发布的掩码是result

无论如何,无论你想要的面具是什么,你所要做的就是使用imoverlay function。这是一个基于您的代码的小例子:

out = imoverlay(star,result,[1 0 0]);
imshow(out);

这是输出:

Output


0
投票

如果Tommaso建议的imoverlay的不透明蒙版不是您所追求的,则可以修改输入的RGB值以在所选像素上投射色调而不会使其饱和。它只涉及一点点。

I = find(result);

为您提供2D图像中像素的索引。然而,star是3D。这些索引将指向相同的像素,但仅指向第一个2D切片。也就是说,如果I指向像素(x,y),则它等效地指向像素(x,y,1)。那是像素的红色成分。要索引(x,y,2)(x,y,2),绿色和蓝色成分,你需要通过Inumel(result)增加2*numel(result)。也就是说,star(I)访问所选像素的红色分量,star(I+numel(result))访问绿色分量,star(I+2*numel(result))访问蓝色分量。

既然我们可以访问这些值,我们如何修改它们的颜色?

这就是imoverlay所做的:

I = find(result);
out = star;
out(I) = 255; % red channel
I = I + numel(result);
out(I) = 0; % green channel
I = I + numel(result);
out(I) = 0; % blue channel

相反,您可以按比例增加红色的亮度,并减少绿色和蓝色。这将改变色调,增加饱和度,并保持恒星内强度的变化。我建议伽玛函数,因为它不会导致强烈的饱和度假象:

I = find(result);
out = double(star)/255;
out(I) = out(I).^0.5; % red channel
I = I + numel(result);
out(I) = out(I).^1.5; % green channel
I = I + numel(result);
out(I) = out(I).^1.5; % blue channel
imshow(out)

通过增加1.5和减少0.5,你可以使效果更强。

© www.soinside.com 2019 - 2024. All rights reserved.