缺陷图像目前还没有搞定————(无奈)
test1
%Sobel方法
I = imread('ChuanJian0.jpg');
G = rgb2gray(I);
E1 = edge(G, 'sobel');
figure, subplot(2,2,1);
imshow(I);
title('Original Color Image');
subplot(2,2,2);
imshow(E1);
title('Sobel Edge');
E2 = edge(G, 'roberts');
subplot(2,2,3);
imshow(E1);
title('Roberts Edge');
E3 = edge(G, 'log');
subplot(2,2,4);
imshow(E1);
title('LOG Edge');
% 固定阈值分割
% BW1 = im2bw(G, 220/256);
% 显示结果
% subplot(2,3,4);
% imshow(BW1);
% title('Fixed threshold');
%
% 自动计算分割阈值
% T = graythresh(G);
% 自动阈值分割
% BW2 = im2bw(G, T);
% 显示分割结果
% subplot(2,3,5);
% imshow(BW2);
% title('Auto threshold');
test2
I = imread('ChuanJian0.jpg');
G = rgb2gray(I);
%固定阈值分割
BW1 = im2bw(G, 220/256);
%显示结果
subplot(2,1,1);
imshow(BW1);
title('Fixed threshold');
%自动计算分割阈值
T = graythresh(G);
%自动阈值分割
BW2 = im2bw(G, T);
%显示分割结果
subplot(2,1,2);
imshow(BW2);
title('Auto threshold');
test3
%图像分割(全局阈值,借助直方图)
clc
clear all
I=rgb2gray(imread('ChuanJian0.jpg'));
figure (1)
imhist(I);
R=I>100;%大于125的地方为白(1),小于为黑(0)
figure(2);
imshow(R);
figure(3);
% 竖值相加
G = sum(R');
plot(G);
xlabel('x');
ylabel('f(x)');
% 进行记录
J = G>mean(G);
disp(mean(G));
figure(4);
plot(J);
xlabel('x');
ylabel('J');
% 进行裁剪
%图像分割(全局阈值,借助直方图)
clc
clear all
I=rgb2gray(imread('test1.jpeg'));
figure (1);
imshow(I)
% imhist(I);
R=I>125;%大于125的地方为白(1),小于为黑(0)
% figure(2);
% imshow(R);
% 竖值相加
G = sum(R');
% figure(3);
% plot(G);
% xlabel('x');
% ylabel('f(x)');
% title('G的图像');
% 进行裁剪
% 1. 去字
chang = 600;
[m,n] = size(R);
G2 = imcrop(R,[1,1,n,chang]);
% figure(4);
% imshow(G2);
% title('G2的图像');
% 2. 现在分解,对G2进行处理
% 进行记录
G2 = sum(G2);
% figure(5);
% plot(G2);
% xlabel('x');
% ylabel('f(x)');
% title('G22的图像');
J = G2>100;
% figure(6);
% plot(J);
% xlabel('x');
% ylabel('J');
% title('J的图像');
% 计算切割点
QG = [];
j=1;
for i=1:length(J)
if J(i)==0
QG(j)=i;
j = j+1;
end
end
% figure(7);
% plot(QG);
% xlabel('x');
% ylabel('f(x)');
% title('QG的图像');
% 计算差值,计算板子的宽度
C= zeros(1,length(QG));
for i=1:length(QG)-1
C(i) = QG(i+1)-QG(i);
end
% figure(8);
% plot(C);
% xlabel('x');
% ylabel('f(x)');
% title('C的图像');
% 所以按照这两个数进行分割
QG = (C>2).*QG;
% figure(9);
% plot(QG);
% xlabel('x');
% ylabel('f(x)');
% title('QG的图像');
% 接下来按照QG中的数字进行分割
fenGe = [];
fenGeOne = [];
a = 1;
for i=1:length(QG)
if QG(i)>0
fenGe(a) = QG(i);
a = a + 1;
end
end
fenGe
b= 1;
figure();
for i = 1:length(fenGe)-1
fenGeOne = I(1:chang,fenGe(i):fenGe(i+1));
subplot(3,4,b);
imshow(fenGeOne);
b = b+1;
if i==length(fenGe)-1
fenGeOne = I(1:chang,fenGe(i+1):n);
subplot(3,4,b);
imshow(fenGeOne);
end
end
实验3 图像分割
实验学时:8学时。
(一)实验目的
1.利用MATLAB研究图像分割与边缘检测的常用算法原理;
2.掌握MATLAB图像域值分割与边缘检测函数的使用方法;
3.了解边缘检测的算法和用途,比较Sobel、Prewitt、Canny等算子边缘检测的差异;
4.对特定场景的图像进行分割。
(二)实验内容和实验原理
1.利用Matlab图像工具箱的图像分割和边缘检测函数对常规图像进行处理。
2.对绿色植物图像分别使用绿色因子法、HSV颜色空间进行分割;
3.对水果图像在YCbCr颜色空间进行分割;
4.对太阳能电池板进行片定位,并对每个单片进行分割,得到缺陷目标图像。
(三)实验步骤
1.灰度阀值分割
(1)全局阈值分割图像
先将一幅彩色图像转换为灰度图像,显示其直方图,参考直方图中灰度的分布,尝试确定阈值;应反复调节阈值的大小,直至二值化的效果最为满意为止。给图像加上零均值的高斯噪声重复上述过程,注意阈值的选择。
(2)局部阈值分割图像
自选图像,对图进行多阈值分割,注意阈值的选择。
2.边缘检测
(1)使用Roberts 算子的图像分割实验,调入并显示一幅图像*.gif或*.tif;
使用Roberts 算子对图像进行边缘检测处理;Roberts 算子为一对模板,相应的矩阵为:
rh = [0 1;-1 0]; rv = [1 0;0 -1];
这里的rh 为水平Roberts 算子,rv为垂直Roberts 算子。可以显示处理后的水平边界和垂直边界检测结果;
用“欧几里德距离”方式计算梯度的模,显示检测结果;对于检测结果进行二值化处理,并显示处理结果。
(2)使用Prewitt 算子的图像分割,过程同(1)中的全部步骤。
(3)使用Sobel 算子的图像分割,过程同(1)中的全部步骤。
(4)使用Canny算子进行图像分割,过程同(1)中的全部步骤。
3.对绿色植物图像分别使用绿色因子法、HSV颜色空间进行分割;
(1)绿色因子法步骤:
对RGB图像进行通道分离;
对每个通道进行归一化;
计算超绿因子;
将超绿因子矩阵转换为灰度图像;
对超绿因子灰度图像进行阈值分割。
(2)基于HSV的绿色植物分割步骤:
将RGB图像转换为HSV图像;
对HSV图像进行通道分离;
确定绿色植物的H范围;
将H分量中范围外的数据置0;
对处理后的H分量进行阈值分割。
4.对水果图像在YCbCr颜色空间进行分割;
5.对太阳能电池板进行片定位,并对每个单片进行分割,得到缺陷目标图像。
对片进行定位
获取每个单片的子图像
对各个单片子图像进行图像分割,得到缺陷目标图像。
(四)实验报告要求
1.描述上述图像处理的算法;
2.列出上述图像处理的程序;
3.记录并分析实验结果;
4.撰写心得体会。
对绿色植物图像分别使用绿色因子法、HSV颜色空间进行分割;
绿色植物分割图
%超绿特征分割
%先用最大类间方差法自动计算最佳阈值T,然后计算超绿分量ExG=2G-R-B,大于等于T,赋值为255,反之赋值为0
clear all;
clc;
image = imread('test2.JPG');
image = im2double(image); %图像运算不能用uint8类型,会发生溢出现象,要转成double类型
R = image(:,:,1);
G = image(:,:,2);
B = image(:,:,3);
ExG = 2*G-R-B;
[m,n] = size(ExG);
T = graythresh(ExG);%graythresh函数是使用OTSU(大津)算法返回输出最佳阈值的算法。
h = ExG;
for i = 1:m
for j= 1:n
if h(i,j) >= T
h(i,j)=255;
else h(i,j)=0;
end
end
end
subplot(131),imshow(image),title('原始图片');
subplot(132),imshow(ExG),title('超绿灰度化')
subplot(133),imshow(h),title('超绿分割二值图')
自己写的
clc
clear all
I=imread('test2.JPG');
figure (1);
imshow(I)
%%R通道
R = I(:,:,1);
figure (2);
imshow(R);
title('R通道');
imhist(R);
%%G通道
G = I(:,:,2);
figure (3);
imshow(G);
title('G通道');
imhist(G);
%%B通道
B = I(:,:,3);
figure (4);
imshow(B);
title('B通道');
imhist(B);
这里是进行HSV与RGB转换
clc
clear all
I=imread('test2.JPG');
figure (1);
imshow(I)
RGB = I;
HSV=rgb2hsv(RGB);%%表示将RGB图像转换为HSV图像。
figure();
imshow(HSV);
title('HSV图像');
基于HSV的绿色植物分割步骤:
拼接:
close all;clear all;clc;
I=imread('test.jpeg');%读入图片
% figure,imshow(I);
I_h=rgb2hsv(I);%RGB转hsv
[height,width,c]=size(I);
h = I_h(:,:,1);
s = I_h(:,:,2);
v = I_h(:,:,3);
figure,
subplot(2,2,1),imshow(I_h);title('hsv格式图');
subplot(2,2,2),imshow(h);title('h');
subplot(2,2,3),imshow(s);title('s');
subplot(2,2,4),imshow(v);title('v');
% figure,
% imhist(h);
% % 得到阈值 0.5
% one = h>0;
% figure,
% imshow(one);
for i=1:height
for j=1:width
h=I_h(i,j,1);
s=I_h(i,j,2);
v=I_h(i,j,3);
% 通过将h通道颜色值特定范围内饱和度设为0,保留范围外颜色值
if 0.38<h || h<0.15
I_h(i,j,2)=0;
end
end
end
I_r=hsv2rgb(I_h);
figure, imshow(I_r);
找的代码
clear all;
clc;
flag = imread('test.jpeg'); % 读取图像
figure;
imshow(flag); % 展示图像
% 将图像的rgb色彩空间转化至hsv色彩空间
flag_hsv = rgb2hsv(flag);
% 创建一个白色图像,将特定颜色提取到此处
flag_new = 255*ones(size(flag));
% 将该图像转至hsv色彩空间
flag_new_hsv = rgb2hsv(flag_new);
% 找出图像中绿色的像素
[row, col] = ind2sub(size(flag_hsv),find(flag_hsv(:,:,1)>0.12...
& flag_hsv(:,:,1)< 0.6 & flag_hsv(:,:,2)>0.16 & flag_hsv(:,:,3)>0.18));
% 将图像中的绿色像素复制到刚才新建的白色图像中
for i = 1 : length(row)
flag_new_hsv(row(i),col(i),:) = flag_hsv(row(i),col(i),:);
end
% 将提取出来的绿色,转化至rgb空间,进行展示
flag_green = hsv2rgb(flag_new_hsv);
figure
imshow(flag_green)
4. 对水果图像在YCbCr颜色空间进行分割
% I = imread("test2.jpeg");
% % I = rgb2gray(I);
% YCBCR = rgb2ycbcr(RGB);
% imshow(YCBCR),title('YCBCR');
clc,clear,close all;
f=imread('test2.jpeg');
imshow(f);
fy=rgb2ycbcr(f);
cr=fy(:,:,3);
figure,imshow(cr);
% figure();imhist(cr);
cr(cr<100|cr>132)=0;
cr(cr~=0)=255;
% figure,imshow(cr);
bw=imbinarize(cr);
% figure,imshow(bw);
bw=imfill(bw,'holes');
% figure,imshow(bw);
bwao=bwareaopen(bw,500);
figure,imshow(bwao);
[r,c]=find(bwao);
resual=f(min(r):max(r),min(c):max(c),:);
figure,imshow(resual);
5. 边缘检测
clc;clear all;
img = imread('test.png');
figure;
img = rgb2gray(img);
imshow(img),title("原图像");
[ROW,COL] = size(img);
img = double(img);
new_img = zeros(ROW,COL); %新建画布
%定义robert算子
roberts_x = [1,0;0,-1];
roberts_y = [0,-1;1,0];
for i = 1:ROW - 1
for j = 1:COL - 1
funBox = img(i:i+1,j:j+1);
G_x = roberts_x .* funBox;
G_x = abs(sum(G_x(:)));
G_y = roberts_y .* funBox;
G_y = abs(sum(G_y(:)));
roberts_xy = G_x * 0.5 + G_y * 0.5;
new_img(i,j) = roberts_xy;
end
end
figure(2);
imshow(new_img/255),title("robert算子的图像");
% 定义laplace算子
laplace = [0,1,0;1,-4,1;0,1,0];
for i = 1:ROW - 2
for j = 1:COL - 2
funBox = img(i:i+2,j:j+2);
G = laplace .* funBox;
G = abs(sum(G(:)));
new_img(i+1,j+1) = G;
end
end
figure(3)
imshow(new_img/255),title("laplace算子的图像");
%定义sobel算子
sobel_x = [-1,0,1;-2,0,2;-1,0,1];
sobel_y = [-1,-2,-1;0,0,0;1,2,1];
for i = 1:ROW - 2
for j = 1:COL - 2
funBox = img(i:i+2,j:j+2);
G_x = sobel_x .* funBox;
G_x = abs(sum(G_x(:)));
G_y = sobel_y .* funBox;
G_y = abs(sum(G_y(:)));
sobelxy = G_x * 0.5 + G_y * 0.5;
new_img(i+1,j+1) = sobelxy;
end
end
figure(4);
imshow(new_img/255),title("sobel的图像");
%定义Prewitt算子
sobel_x = [-1,0,1;-1,0,1;-1,0,1];
sobel_y = [-1,-1,-1;0,0,0;1,1,1];
for i = 1:ROW - 2
for j = 1:COL - 2
funBox = img(i:i+2,j:j+2);
G_x = sobel_x .* funBox;
G_x = abs(sum(G_x(:)));
G_y = sobel_y .* funBox;
G_y = abs(sum(G_y(:)));
sobelxy = G_x * 0.5 + G_y * 0.5;
new_img(i+1,j+1) = sobelxy;
end
end
figure(5);
imshow(new_img/255),title("Prewitt的图像");
function test(I_in)
figure(1),subplot(121),imshow(I_in),title('原图');
[row,col] = size(I_in);
I=double(I_in);
I(:, size(I_in, 2) + 1) = 195;
I(size(I_in, 1) + 1, :) = 195;
g = zeros(row,col);
g_x=zeros(row,col); % 水平方向
g_y=zeros(row,col); % 垂直方向
for i=1:row
for j=1:col
x=abs(I(i+1,j+1)-I(i,j));
y=abs(I(i+1,j)-I(i,j+1));
sum=x+y;
g(i,j) = sum;
g_x(i,j)=x;
g_y(i,j)=y;
end
end
NumPixel = zeros(1,row); % 建立一个256列的行向量,以统计各灰度级的像素个数
for i = 1 : row
for j = 1 : col
k = g(i,j); % k是像素点(i,j)的灰度值
NumPixel(k+1) = NumPixel(k+1) + 1; % 对应灰度值像素点数量加1
end
end
figure(2),bar(NumPixel); % 灰度图像的直方图
figure(1),subplot(122),imshow(g,[]),title('卷积结果');
I2=g;
for i = 1 : row
for j = 1 : col
if I2(i,j) < 80
I2(i,j) = 1;
else
I2(i,j) = 0;
end
end
end
figure(3),subplot(121),imshow(g_x,[]),title('水平边界检测结果');
figure(3),subplot(122),imshow(g_y,[]),title('垂直边界检测结果');
figure,imshow(I2),title('二值化图像');
end
%图像分割(全局阈值,借助直方图)
clc
clear all
I=rgb2gray(imread('test.jpeg'));
figure (1);
imshow(I)
% imhist(I);
R=I>125;%大于125的地方为白(1),小于为黑(0)
% figure(2);
% imshow(R);
% 竖值相加
G = sum(R');
% figure(3);
% plot(G);
% xlabel('x');
% ylabel('f(x)');
% title('G的图像');
% 进行裁剪
% 1. 去字
chang = 600;
[m,n] = size(R);
G2 = imcrop(R,[1,1,n,chang]);
% figure(4);
% imshow(G2);
% title('G2的图像');
% 2. 现在分解,对G2进行处理
% 进行记录
G2 = sum(G2);
% figure(5);
% plot(G2);
% xlabel('x');
% ylabel('f(x)');
% title('G22的图像');
J = G2>100;
% figure(6);
% plot(J);
% xlabel('x');
% ylabel('J');
% title('J的图像');
% 计算切割点
QG = [];
j=1;
for i=1:length(J)
if J(i)==0
QG(j)=i;
j = j+1;
end
end
% figure(7);
% plot(QG);
% xlabel('x');
% ylabel('f(x)');
% title('QG的图像');
% 计算差值,计算板子的宽度
C= zeros(1,length(QG));
for i=1:length(QG)-1
C(i) = QG(i+1)-QG(i);
end
% figure(8);
% plot(C);
% xlabel('x');
% ylabel('f(x)');
% title('C的图像');
% 所以按照这两个数进行分割
QG = (C>2).*QG;
% figure(9);
% plot(QG);
% xlabel('x');
% ylabel('f(x)');
% title('QG的图像');
% 接下来按照QG中的数字进行分割
fenGe = [];
fenGeOne = [];
a = 1;
for i=1:length(QG)
if QG(i)>0
fenGe(a) = QG(i);
a = a + 1;
end
end
% fenGe
b= 1;
figure();
for i = 1:length(fenGe)-1
fenGeOne = I(1:chang,fenGe(i):fenGe(i+1));
subplot(3,4,b);
imshow(fenGeOne);
b = b+1;
if i==1
c = fenGeOne;
end
if i==2
d = fenGeOne;
end
if i==length(fenGe)-1
fenGeOne = I(1:chang,fenGe(i+1):n);
subplot(3,4,b);
e=fenGeOne;
imshow(fenGeOne);
end
end
c = c(1:255,1:255);
d = d(1:255,1:255);
e = e(1:255,1:255);
figure();imshow(c);
figure();imshow(d);
figure();imshow(e);
a = corr2(c,d);
disp(a);
b = corr2(d,e);
disp(b);
知识点:
- 转换hsv和RGB图像
ImgHSV = rgb2hsv(ImgRGB);
ImgRGB = hsv2rgb(ImgHSV);