matlab 对线路板进行裁剪

缺陷图像算是做出来了,就只针对这个图像(在最后)
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');
% 进行裁剪

2
1

%图像分割(全局阈值,借助直方图)
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颜色空间进行分割

000

% 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);

最终结果:

%图像分割(全局阈值,借助直方图)
clc
clear all
I=rgb2gray(imread('ChuanJian0.jpg'));
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;
fen = zeros([1,12]);
for i = 1:length(fenGe)-1
    fenGeOne = I(1:chang,fenGe(i):fenGe(i+1));
    subplot(3,4,b);
    imshow(fenGeOne);
    s = judge(fenGeOne);
    fen(i) = s;
    b = b+1;
    if i==length(fenGe)-1
        fenGeOne = I(1:chang,fenGe(i+1):n);
        subplot(3,4,b);
        imshow(fenGeOne);
        fen(i) = s;
    end
end
% 对缺陷图像进行显示
for i = 1:length(fenGe)
    fenGeOne = I(1:chang,fenGe(i):fenGe(i+1));
    if fen(i)==1
        figure('Name','缺陷图像');
        imshow(fenGeOne);
    end
    if i==length(fenGe)-1
        fenGeOne = I(1:chang,fenGe(i+1):n);
        if fen(i)==1
        figure('Name','缺陷图像');
        imshow(fenGeOne);
        end
    end
end
fen


% 进行判断
function s = judge(img)
%     figure();
%     subplot(1,2,1),imshow(img);
%     subplot(1,2,2),
    I = sum(img);
    I=I>109000;
%     plot(I);
    z = 0;
    for i = 1:length(I)
       if I(i)==1
           z = z+1;
       end
    end
    if z*100/length(I)>10
        s = 1;
    else s = 0;
    end
end

运行结果:
1

2

3

知识点:

  1. 转换hsv和RGB图像
ImgHSV = rgb2hsv(ImgRGB);
ImgRGB = hsv2rgb(ImgHSV);

猜你喜欢

转载自blog.csdn.net/weixin_51395608/article/details/129797302
今日推荐