基于k均值的hsv彩色空间油菜花图像分割
程序员文章站
2024-02-11 09:30:28
...
1.基于k均值的hsv彩色空间油菜花图像分割
原图
k均值处理之后的效果图
基于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.图像“上色”
之前看别人的一篇帖子,感觉比较有意思,如有侵权,望请告知
源码:
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)
推荐阅读