实验四图像处理代码解析

I=imread('D:\ALLDOWNLOAD\彩色图像处理-实验\你的图.tif');

mask=roipoly(f);

R=immultiply(mask,f(:,:,1));

G=immultiply(mask,f(:,:,2));

B=immultiply(mask,f(:,:,3));

g=cat(3,R,G,B);

subplot(3,3,1);imshow(g);title('原图像');%找出平均矢量m和协方差矩阵C

[M,N,K]=size(g);

%重新排列g中的彩色元素

I=reshape(g,M*N,3);

%找出彩色像素的行索引

idx=find(mask);

I=double(I(idx,1:3));

%计算平均矢量m和协方差矩阵C

[C,m]=covmatrix(I);

%计算C的对角线元素并计算它们的平方根

%sd中的第一二三个元素是ROI区域中的红绿蓝分量的标准差

d=diag(C);

sd=sqrt(d);%用欧几里得距离来计算

%以T的25倍作为阈值,这个值是最大标准差的近似

E25=colorseg('euclidean',f,25,m);

subplot(3,3,2),imshow(E25);

%以T的50倍作为阈值

E50=colorseg('euclidean',f,50,m);

subplot(3,3,3),imshow(E50);%以T的75倍作为阈值

E75=colorseg('euclidean',f,75,m);

subplot(3,3,4),imshow(E75);%以T的100倍作为阈值

E100=colorseg('euclidean',f,100,m);

subplot(3,3,5),imshow(E100);

f=imread('D:\ALLDOWNLOAD\彩色图像处理-实验\你的图.tif');

size(f);

mask=roipoly(f);

R=immultiply(mask,f(:,:,1));

G=immultiply(mask,f(:,:,2));

B=immultiply(mask,f(:,:,3));

g=cat(3,R,G,B);

figure,imshow(g);

[M,N,K]=size(g);

I=reshape(g,M*N,3);

idx=find(mask);

I=double(I(idx,1:3));

[C,m]=covmatrix(I);

d=diag(C);

sd=sqrt(d);

E25=colorseg('euclidean',f,25,m);

subplot(2,2,1),imshow(E25);

E50=colorseg('euclidean',f,50,m);

subplot(2,2,2),imshow(E50);

E75=colorseg('euclidean',f,75,m);

subplot(2,2,3),imshow(E75);

E100=colorseg('euclidean',f,100,m);

subplot(2,2,5),imshow(E100);

这段代码实现了基于欧几里得距离的彩色图像分割。首先读取一个彩色图像,选择一个感兴趣区域(ROI),然后通过roipoly函数获取该感兴趣区域的掩膜。接着,将掩膜应用于原始图像的每个通道,得到分离后的颜色通道。将分离的颜色通道合并成一个三通道的图像,并将其展开成一个二维的矩阵。然后,计算感兴趣区域内的像素点的协方差矩阵和均值向量。通过协方差矩阵的特征值和特征向量,可以得到每个通道的标准差。最后,使用colorseg函数将图像分割成不同的区域,分别设置25、50、75和100的距离阈值,并将每个分割结果可视化。

I=imread('D:\ALLDOWNLOAD\实验四、彩色图像处理\彩色图像处理\lena_color.bmp');

subplot(231),imshow(I);title('原图像');

I_R=I(:,:,1);

BW1_R=edge(I_R,'sobel');

I_G=I(:,:,2);

BW1_G=edge(I_G,'sobel');

I_B=I(:,:,3);

BW1_B=edge(I_B,'sobel');

out(:,:,1)=BW1_R;

out(:,:,2)=BW1_G;

out(:,:,3)=BW1_B;

subplot(232);imshow(double(out),[]);title('out3arrays');

out2=cat(3,BW1_R,BW1_G,BW1_B);

subplot(233);imshow(double(out2),[]);title('cat3arrays');

[VG,A,PPG]=colorgrad(I);subplot(234);imshow(VG);title('VG');

subplot(235);imshow(A);title('A');

subplot(236);imshow(PPG);title('PPG');

这段代码是用 Matlab 对彩色图像进行边缘检测和颜色梯度计算的操作。首先读入一张彩色图像,然后分别对图像的三个通道进行 Sobel 边缘检测,得到三个二值图像。接着将这三个二值图像组合成一个三通道的输出图像。其中,subplot 函数用于将图像显示在一个大的画布上,title 函数用于添加图像标题。接下来,调用 colorgrad 函数计算图像的颜色梯度,得到三个梯度图像 VG、A 和 PPG,同样用 subplot 函数将它们显示在画布上。

错误使用checkForSameSizeAndClass(第8 行)和Y的类必须相同。 出错immultiply(第52_行) checkForSamesizeAndClass(×, Y, mfilename ) ;怎么解决

这个错误通常是由于两个矩阵的尺寸不匹配或类型不同导致的。

你可以尝试以下方法来解决这个问题:

1.确保两个矩阵的尺寸相同。你可以使用size()函数来检查矩阵的尺寸,并使用reshape()函数来使它们具有相同的尺寸。

2.确保两个矩阵的类型相同。使用class()函数来检查矩阵的类型,并使用cast()函数来将它们转换为相同的类型。

3.确保你传递给checkForSameSizeAndClass()函数的参数类型相同。如果参数类型不同,可以使用cast()函数将它们转换为相同的类型。

如果你仍然无法解决问题,请查看你的代码是否有其他错误。你可以使用Matlab的调试器来帮助你查找和解决问题。

这串代码应该是有问题的,因为它只定义了6个subplot,而你却想要显示7个图像。你可以尝试修改代码,增加一个subplot,例如:这样就可以显示7个图像了,其中最后一个图像是红色通道的Sobel边缘检测结果。

I=imread('D:\ALLDOWNLOAD\彩色图像处理-实验\你的图.tif');

subplot(331),imshow(I);title('原图像');

I_R=I(:,:,1);

BW1_R=edge(I_R,'sobel');

I_G=I(:,:,2);

BW1_G=edge(I_G,'sobel');

I_B=I(:,:,3);

BW1_B=edge(I_B,'sobel');

out(:,:,1)=BW1_R;

out(:,:,2)=BW1_G;

out(:,:,3)=BW1_B;

subplot(332);imshow(double(out),[]);title('out3arrays');

out2=cat(3,BW1_R,BW1_G,BW1_B);

subplot(333);imshow(double(out2),[]);title('cat3arrays');

[VG,A,PPG]=colorgrad(I);

subplot(334);imshow(VG);title('VG');

subplot(335);imshow(A);title('A');

subplot(336);imshow(PPG);title('PPG');

subplot(337);imshow(BW1_R);title('Red Sobel edge');