为什么我不能从原始图像中为我的分割区域着色
Why can't I colour my segmented region from the original image
我有以下代码:
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
。最后我进行区域过滤以去除图像中留下的任何混乱,这样我只剩下我正在寻找的对象。
现在我想根据分割蒙版对原始图像重新着色,以改变海星的颜色。我想创建红色、绿色、蓝色通道,为它们赋值,然后在图像上放置蒙版。 (以红海星为例)
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 行)
红(星号)=星号(:,:,255);
我目前的做法有什么问题?
您的代码有点令人困惑...我不明白您要使用的掩码是 starS
还是 result
,因为它们看起来都像二维索引器。在您的第二个代码片段中,您使用了 starS
,但您在问题中发布的掩码是 result
.
总之,无论你想要什么样的面具,你所要做的就是使用imoverlay function。这是一个基于您的代码的小示例:
out = imoverlay(star,result,[1 0 0]);
imshow(out);
这是输出:
如果 Tommaso 建议的 imoverlay
不透明蒙版不是您想要的,您可以修改输入的 RGB 值以在选定像素上投射色调而不会使它们饱和。它只是稍微复杂一点。
I = find(result);
为您提供二维图像中像素的索引。但是,star
是 3D 的。这些索引将指向相同的像素,但仅指向第一个 2D 切片。即如果I
指向像素(x,y)
,则相当于指向像素(x,y,1)
。即像素的红色分量。要索引 (x,y,2)
和 (x,y,2)
,即绿色和蓝色分量,您需要将 I
递增 numel(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
可以使效果更强。
我有以下代码:
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
。最后我进行区域过滤以去除图像中留下的任何混乱,这样我只剩下我正在寻找的对象。
现在我想根据分割蒙版对原始图像重新着色,以改变海星的颜色。我想创建红色、绿色、蓝色通道,为它们赋值,然后在图像上放置蒙版。 (以红海星为例)
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 行) 红(星号)=星号(:,:,255);
我目前的做法有什么问题?
您的代码有点令人困惑...我不明白您要使用的掩码是 starS
还是 result
,因为它们看起来都像二维索引器。在您的第二个代码片段中,您使用了 starS
,但您在问题中发布的掩码是 result
.
总之,无论你想要什么样的面具,你所要做的就是使用imoverlay function。这是一个基于您的代码的小示例:
out = imoverlay(star,result,[1 0 0]);
imshow(out);
这是输出:
如果 Tommaso 建议的 imoverlay
不透明蒙版不是您想要的,您可以修改输入的 RGB 值以在选定像素上投射色调而不会使它们饱和。它只是稍微复杂一点。
I = find(result);
为您提供二维图像中像素的索引。但是,star
是 3D 的。这些索引将指向相同的像素,但仅指向第一个 2D 切片。即如果I
指向像素(x,y)
,则相当于指向像素(x,y,1)
。即像素的红色分量。要索引 (x,y,2)
和 (x,y,2)
,即绿色和蓝色分量,您需要将 I
递增 numel(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
可以使效果更强。