实验四图像处理代码解析
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');