欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

基于k均值的hsv彩色空间油菜花图像分割

程序员文章站 2024-02-11 09:30:28
...

1.基于k均值的hsv彩色空间油菜花图像分割
原图
基于k均值的hsv彩色空间油菜花图像分割
k均值处理之后的效果图
基于k均值的hsv彩色空间油菜花图像分割
基于k均值hsv彩色空间处理效果图
基于k均值的hsv彩色空间油菜花图像分割
效果显然可见。


close all;
 clear all;
 clc;
 I_rgb=imread('1.png');%读取一张RGB彩图,此时也可以的当成数据矩阵
 %[I_rgb,rect]=imcrop(I_rgb); %裁剪图片
 %rectangle('Position',rect,'LineWidth',2,'EdgeColor','r');
 %imwrite(I_rgb,'截图原图1.jpg')  %保存
 imshow(I_rgb); %显示图像
 title('原始图像'); 
 %I_hsv=rgb2hsv(I_rgb)
 %将彩色图像从RGB转化到lab彩色空间
 C = makecform('srgb2lab'); %设置格式makecform创建一个颜色转换结构
 I_lab = applycform(I_rgb,C); 
 
 %进行K-mean聚类将图像分割成三个区域
 ab = double(I_lab(:,:,2:3)); %取出lab空间的a分量和b分量
 nrows = size(ab,1); %得到ab的行的长度
 ncols = size(ab,2); %得到ab的列的长度
 
 %reshape函数重新调整矩阵的行数、列数、维数。返回一个(nrows*ncols)*2的矩阵ab
 %结果ab中元素是按列从右边ab中得到的。如果右边ab中元素个数没有(nrows*ncols)*2个, 则会引发错误。
 %K表示将X划分为几类,为整数
 %Distance距离测度;sqEuclidean欧氏距离;cluster初始聚类阶段随机选取10%的X的子样本;Replicates聚类重复次数,为整数
 ab = reshape(ab,nrows*ncols,2); %改变矩阵的列数和行数,但是数据总个数不变
 nColors=3; %分割区域为3 
 [cluster_idx cluster_center] = kmeans(ab,nColors,'distance','sqEuclidean','Replicates',3);% matlab自身有这个算法kmeans 算法
 pixel_labels = reshape(cluster_idx,nrows,ncols);%改变矩阵的列数和行数 Idx---N*1的向量,存储的是每个点的聚类标号,center---K*P的矩阵,存储的是K个聚类质心位置
 figure();  
 imshow(pixel_labels,[]), title('聚类结果');
 Images = cell(1,3); %定义一个数组,存储图像
 
%函数repmat;例子B = repmat(A,[m n p...]),B 是由 m×n×p×… 个 A 平铺而成的高维数组。
%B 的维数是 [size(A,1)*m, size(A,2)*n, size(A,3)*p, ...] 。
 rgb_label = repmat(pixel_labels,[1 1 3]);  %rgb_label由pixel_labels平铺而来
 
 %显示聚类图像
 for k = 1:nColors
 color =I_rgb;  
 color(rgb_label ~= k) = 0;  
 Images{k} = color; 
end 
figure(),imshow(Images{1}), title('分割区域1'); 
figure(),imshow(Images{2}), title('分割区域2'); 
figure(),imshow(Images{3}), title('分割区域3');


```python
clear all;
clc;
% 读取彩色图像
rgb = imread('Images{1}'); 
%[rgb,rect]=imcrop(rgb);
%rectangle('Position',rect,'LineWidth',2,'EdgeColor','r'); 
figure;
%imwrite(rgb,'t.jpg')
imshow(rgb);      
% 将图像的rgb色彩空间转化至hsv色彩空间
flag_hsv =rgb2hsv(rgb);      
% 创建一个白色图像,将黄色提取到此处
I_rgb_new = 0*ones(size(rgb));
% 将该图像转至hsv色彩空间
I_rgb_new_hsv = rgb2hsv(I_rgb_new);
% 找出油菜图中的黄色像素
[row, col] = ind2sub(size(flag_hsv),find(...
(flag_hsv(:,:,1)>0.145 & flag_hsv(:,:,1)<0.189) & ...
( flag_hsv(:,:,2)<1.004 & flag_hsv(:,:,2)>0.169)&...
(flag_hsv(:,:,3)<1.004 & flag_hsv(:,:,3)>0.180)...
));%flag_hsv(:,:,2)<1.004 &,flag_hsv(:,:,3)<1.004 &
% 将油菜中的黄色像素复制到刚才新建的白色图像中
%(flag_hsv(:,:,1)>0.145 & flag_hsv(:,:,1)<0.189)
%( flag_hsv(:,:,2)<1.004 & flag_hsv(:,:,2)>0.169)&
%(flag_hsv(:,:,3)<1.004 & flag_hsv(:,:,3)>0.180)
for i = 1 : length(row)
    I_rgb_new_hsv(row(i),col(i),:) = flag_hsv(row(i),col(i),:);
end
% 将提取出来的黄色,转化至rgb空间,进行展示
rape_yellow= hsv2rgb(I_rgb_new_hsv);
imshow(rape_yellow);
imwrite(rape_yellow,'hsv.jpg');

2.图像“上色”
之前看别人的一篇帖子,感觉比较有意思,如有侵权,望请告知
基于k均值的hsv彩色空间油菜花图像分割
源码:

function R=gray2rgb(img1,img2)
tic
 clc;
 warning off;
 imt=imread(img1);
 ims=imread(img2);
 [sx sy sz]=size(imt);
 [tx ty tz]=size(ims);
 if sz~=1
     imt=rgb2gray(imt);
 end
 if tz~=3
     disp ('img2 must be a color image (not indexed)');
 else
     imt(:,:,2)=imt(:,:,1);
     imt(:,:,3)=imt(:,:,1);

 % Converting to ycbcr color space
     nspace1=rgb2ycbcr(ims);
     nspace2= rgb2ycbcr(imt);

    ms=double(nspace1(:,:,1));
     mt=double(nspace2(:,:,1));
     m1=max(max(ms));
     m2=min(min(ms));
     m3=max(max(mt));
     m4=min(min(mt));
     d1=m1-m2;
     d2=m3-m4;
 % Normalization
     dx1=ms;
     dx2=mt;
     dx1=(dx1*255)/(255-d1);
     dx2=(dx2*255)/(255-d2);
     [mx,my,mz]=size(dx2);
 %Luminance Comparison
     disp('Please wait..................');
     for i=1:mx
         for j=1:my
              iy=dx2(i,j);
              tmp=abs(dx1-iy);
              ck=min(min(tmp));
              [r,c] = find(tmp==ck);
              ck=isempty(r);
              if (ck~=1)            
                  nimage(i,j,2)=nspace1(r(1),c(1),2);
                  nimage(i,j,3)=nspace1(r(1),c(1),3);
                  nimage(i,j,1)=nspace2(i,j,1);           
             end
          end
      end
     rslt=ycbcr2rgb(nimage);
%      figure,imshow(uint8(imt));
%      figure,imshow(uint8(rslt));
     R=uint8(rslt);
     toc
 end  
close all;clear all;clc;
figure1  %打印图片
subplot(2,2,1);
imshow('gray.jpg');  %灰度图像
subplot(2,2,2);imshow('color1.jpg') 
colorIm=gray2rgb('gray.jpg','color1.jpg');
subplot(2,2,3);
imshow(colorIm)
相关标签: 分割