matlab芯片尺寸检测

第一次用csdn记录写的代码!找到了两年前熬夜搞竞赛,敲matlab代码的感觉。

最近在搞一个matlab图像处理的GUI设计,其中有个要求:检测芯片封装外壳的尺寸。

所给芯片如下:

行(列)相邻两行(列)后做差后,在求和,即可统计1的个数。

下图为统计图像:

源代码如下:

clc,clear,close all
I = imread('D:\YJT\matlab\bin\Image_processing_GUI_new\mumu_final\A4.jpg');%输入原始图像
thresh = graythresh(I);
erzhi = im2bw(I,thresh);%图像二值化,变成二维的0、1数据矩阵
erzhi = bwareaopen(erzhi,20);%从对象中移除面积小于30的小对象
% figure,imshow(erzhi),title('形态滤波后二值图像');
[r,c] = size(erzhi);%获得二值图像行、列

%% 行处理
%按行扫描二值图像
for i = 1 : r-1
    dR(i,:) = erzhi(i+1,:) - erzhi(i,:);%每列像素值求和矩阵
end
cnt = sum(dR,2);%计算差值中1的个数
a_cnt = abs(cnt);
% s_cnt_1 = sort(a_cnt(1:r/2),'descend');
% s_cnt_2 = sort(a_cnt((1+r/2):r-1),'descend');

%直接利用正负对应最大最小值
r1 = find(cnt == max(cnt(1:r/2)));
r2 = find(cnt == min(cnt(1:r/2)));
[r1,r2] = swap(r1,r2);
r3 = find(cnt == max(cnt((1+r/2):(r-1))));
r4 = find(cnt == min(cnt((1+r/2):(r-1))));
[r3,r4] = swap(r3,r4);
figure,plot(cnt)


%% 列处理
%按列扫描二值图像
for j = 1 : c-1
    dC(:,j) = erzhi(:,j+1) - erzhi(:,j);%每列像素值求和矩阵
end
cnt_1 = sum(dC);%计算差值中1的个数

%直接利用正负对应最大最小值
c1 = find(cnt_1 == max(cnt_1(1:c/2)));
c2 = find(cnt_1 == min(cnt_1(1:c/2)));
[c1,c2] = swap(c1,c2);
c3 = find(cnt_1 == max(cnt_1((1+c/2):(c-1))));
c4 = find(cnt_1 == min(cnt_1((1+c/2):(c-1))));
[c3,c4] = swap(c3,c4);
figure,plot(cnt_1)

%% 显示检测到的边界
figure,imshow(erzhi)
%  rect = [r1 r2 c c];%其中250为x坐标,100为y坐标,550为x方向上的长度,450为y方向上的长度。

%芯片封装外壳尺寸
rect = [c2 r2 c3-c2 0];rectangle('Position',rect,'LineWidth',2,'EdgeColor','r') 
rect = [c2 r3 c3-c2 0];rectangle('Position',rect,'LineWidth',2,'EdgeColor','r') 
rect = [c2 r2 0 r3-r2];rectangle('Position',rect,'LineWidth',2,'EdgeColor','r') 
rect = [c3 r2 0 r3-r2];rectangle('Position',rect,'LineWidth',2,'EdgeColor','r') 

%芯片引脚尺寸
rect = [c1 r2 c2-c1 0];rectangle('Position',rect,'LineWidth',2,'EdgeColor','b') 
rect = [c1 r3 c2-c1 0];rectangle('Position',rect,'LineWidth',2,'EdgeColor','b') 
rect = [c3 r2 c4-c3 0];rectangle('Position',rect,'LineWidth',2,'EdgeColor','b') 
rect = [c3 r3 c4-c3 0];rectangle('Position',rect,'LineWidth',2,'EdgeColor','b')
rect = [c1 r2 0 r3-r2];rectangle('Position',rect,'LineWidth',2,'EdgeColor','b') 
rect = [c4 r2 0 r3-r2];rectangle('Position',rect,'LineWidth',2,'EdgeColor','b') 

%% 输出尺寸
width = c3-c2;%芯片外壳宽度
height = r3-r2;%芯片外壳高度

d_pin = (c2-c1+c4-c3)/2;%引脚长度


function [c,d] = swap(c,d)%交换函数,保证边界变量的顺序
    if (c < d ),end
    if (c == d),end
    if(c > d)
        tmp = c;
        c = d;
        d = tmp;
    end  
end

%created by yjt
%0:01   2024.5.13 

具体细节明天再补吧!

  • 10
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值