Matlab 为什么可以';从原始图像给分割区域上色

Matlab 为什么可以';从原始图像给分割区域上色,matlab,image-segmentation,Matlab,Image Segmentation,我有以下代码: 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 =

我有以下代码:

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));
这给了我一个错误:索引超过了矩阵维数

Project4中的错误(第28行) 红色(星星)=星星(:,:,255)


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

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

无论如何,不管你想要的面具是什么,你所要做的就是使用它。下面是一个基于您的代码的小示例:

out = imoverlay(star,result,[1 0 0]);
imshow(out);
以下是输出:


如果Tommaso建议的iOverlay的不透明遮罩不是您想要的,您可以修改输入的RGB值,在选定像素上投射色调,而不会使其饱和。它只是稍微有点复杂

I = find(result);
提供2D图像中像素的索引。但是,
star
是3D的。这些索引将指向相同的像素,但仅指向第一个2D切片。也就是说,如果
I
指向像素
(x,y)
,则它等价地指向像素
(x,y,1)
。这是像素的红色分量。要索引绿色和蓝色组件
(x,y,2)
(x,y,2)
,您需要通过
numel(结果)
2*numel(结果)
增加
I
。也就是说,
star(I)
访问选定像素的红色分量,
star(I+numel(结果))
访问绿色分量,
star(I+2*numel(结果))
访问蓝色分量

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

这就是iOverlay所做的:

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
相反,可以按比例增加红色的亮度,并减少绿色和蓝色。这将改变色调,增加饱和度,并保持恒星内部强度的变化。我建议使用gamma函数,因为它不会产生强饱和伪影:

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
可以增强效果。

您也可以提供原始图像吗@TommasoBelluzzo
starS
是一个2D矩阵。你为什么要访问星(:,:,255)?我想把遮罩“星”转换成一个3D矩阵,这样我就可以把它放在原始图像上(它们的大小应该是一样的)。同时将其红色通道设置为最大值。我不知道该怎么做@Crisluengo你可能想把它转换成3D矩阵,但第三维度的大小应该是3<代码>星星(:,:,1)将是红色通道<代码>星星(:,:,255)第255频道会不会…:)值得注意的是,较新的labeloverlay函数支持控制覆盖的透明度:
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)