标签:步骤 nes 统计 形状 旋转 读取 pre 概述 interval
1 概述
1.1 基本思想
用具有一定形态的结构元素去度量和提取图像中的对应形状,以达到对图像分析和识别的目的
1.2 基本运算
膨胀、腐蚀、开操作、闭操作
1.3 数学基础
集合论
结构元素:
原始图像需要扩充使得结构元素位于原始图像边缘时扩充部分可以涵盖整个结构元素。
2 二值图像形态学基本操作
2.1 腐蚀操作
结构元素B全部位于A中对应的位移量z,故会削弱边界
效果:
是一种收缩或细化的操作。
2.1 膨胀操作
结构元素B与A有交集对应的位移量z,故会扩张边界
效果:
是一种增长或粗化的操作。
注:腐蚀和膨胀是对偶的(即对前景腐蚀后求反=对背景膨胀的结果)
2.3 开操作
先腐蚀后膨胀,平滑物体的轮廓,断开较窄的连接条、消除细的突出物
2.4 闭操作
先膨胀后腐蚀,同样能平滑物体的轮廓,但会弥合较窄的间断和细长条
效果:向外的角保持不变,向内的角变圆了,填补间断—“加”
2.5 开操作和闭操作的比较
2.5.1 对偶性(闭操作后取反结果=对背景开操作)
2.5.2 性质
算子应用一次后,再用则无变化
2.5.3 对比效果
2.5.4 应用
开操作取出图像中的小目标(去噪)
闭操作连接目标(消除细小间隔)
2.6 击中击不中变换
目的:形状检测(检测某种特定形状的位置,要求每个物体至少被一个像素宽的背景所围绕)
将前景和背景一起匹配
3 二值图像形态学算法
3.1 边界提取
前景-被腐蚀的前景
3.2 孔洞填充
找一个起始点(位于孔洞中),不停膨胀后并上A反,直到不再发生变化
3.3 联通分量的提取
通过上述迭代公式可以从联通图案的一个已知点得到整个联通图案
3.4 凸壳
凸:集合A内连接任意两个点的连线都在A内,则称集合A是凸的
凸壳:任意集合S的凸壳H是包含于S的最小凸集
其中X0为A,Bi是不同方位的结构元素,一个Bi能够做出一个Di,A的凸壳为所有的Di相交
结果:
3.5 细化
A减去A与结构元B做击中击不中变换匹配到的那部分像素
其中B为结构元序列
步骤:
A被B1~Bn按次序细化,再返回B1,从B1开始按次序细化,直到收敛
3.6 粗化
细化的形态学对偶
A并上A与结构元B做击中击不中变换匹配到的那部分像素的和
3.7 骨架
A的骨架可用腐蚀和开操作表达
其中k代表对A进行k次腐蚀,而K则是A被腐蚀为空集前最后一次迭代
3.8 剪裁
是对细化处理和骨架绘制算法的补充,因为这些处理会将附加部分保留下来,应清楚干净,则需要剪裁来取出寄生的多余部分
4 灰度级形态学
4.1 操作
腐蚀:输出图像变暗,亮的细节被减少
膨胀:输出图像变亮,暗的细节被减少
4.2 效果
开操作:去除较小的明亮细节
闭操作:去除较小的暗细节
4.3 算法
图像平滑:先开(抑制亮细节)后闭(抑制暗细节)
形态学梯度:膨胀-腐蚀
顶帽变换:校正不均匀光照,增强阴影的细节
clc;clear;close;
A=imread(‘datika.jpg‘);%读取图像
imshow(A),title(‘原图‘);
gray=rgb2gray(A);
bw=edge(gray,‘canny‘);%canny算子边缘检测得到二值边缘图像
[h,t,r]=hough(bw,‘RhoResolution‘,0.5,‘ThetaResolution‘,0.5); %Hough变换
figure,imshow(imadjust(mat2gray(h)),‘XData‘,t,‘YData‘,r,‘InitialMagnification‘,‘fit‘),title(‘Hough变换矩阵‘);%显示Hough变换矩阵
xlabel(‘\theta‘),ylabel(‘\rho‘);
axis on, axis normal,hold on;
P=houghpeaks(h,2);
x=t(P(:,2));y=r(P(:,1));
plot(x,y,‘s‘,‘color‘,‘r‘),title(‘‘);%获取并标出参数平面的峰值点
lines=houghlines(bw,t,r,P,‘FillGap‘,5,‘Minlength‘,7);%检测图像中的直线段
figure,imshow(gray);
hold on;
max_len=0;
for i=1:length(lines)
xy=[lines(i).point1;lines(i).point2];
plot(xy(:,1),xy(:,2),‘LineWidth‘,2,‘Color‘,‘g‘);%用绿色线段标注直线段
plot(xy(:,1),xy(1,2),‘x‘,‘LineWidth‘,2,‘Color‘,‘y‘);
plot(xy(:,1),xy(2,2),‘x‘,‘LineWidth‘,2,‘Color‘,‘r‘);%标注直线段端点
end
% x=lines.theta;%由与图像边缘平行的直线段的斜率得到整个图像旋转的角度
% B=imrotate(gray,x);%图像修正
% figure,imshow(B),title(‘旋转后图像‘);
T=graythresh(gray);%使用OTSU方法获得阀值T
result=im2bw(gray,T);%二值化图像
figure,imshow(result),title(‘二值化后结果‘);
%扫描区域:在本程序中,有7个扫描区域,分别对应题号为1-5,6-10,11-15,16-20,21-25,26-30,31-35这几个区域
n=40;m=530;% 首先测得答题区域第一题A选项左上角的坐标(52,244)
s=150;t=228;%s为上下两个扫描区域的距离,t为左右两个扫描区域的距离。
P=4;Q=5;%P为字母项的个数(这里有ABCD共有4项),Q为每个小区域选项数。
interval_length=35;%左右相邻两题填涂区域左边线的距离
interval_width=25;%上下相邻两题填涂区域上边线的距离
length=23;%填涂区域的长度
width=11;%填涂区域的宽度
a2=zeros(4,5);%初始化灰度值统计矩阵
a3=zeros(10,9);%学号 初始化灰度值统计矩阵
%第1-5题区域的检测
for P=1:4
for Q=1:5
%m=244;n=52;%第1-5题区域的检测的起始坐标(即第一题A选项左上角的坐标)
a1=result(m+(P-1)*(interval_width+1) :m+(P-1)*(interval_width+1)+width,n+(Q-1)*(interval_length+1):n+(Q-1)*(interval_length+1)+length);
%得到矩形区域内各像素的灰度值
sum1=sum(sum(a1));%计算统计的矩形区域内像素灰度值之和
a2(P,Q)=sum1;%多次循环后得到20个统计区域的灰度值,并依次放在a2矩阵中
end
end
a2(a2<224)=1;
a2(a2>=225)=0;%对灰度值统计矩阵里的数值进行处理,大于某一阀值的值赋1,其余的赋0。
%在此程序中,涂黑则相应数值为1。
result1_5=a2;%存储1-5题的结果
%第6-10题区域的检测
for P=1:4
for Q=1:5
a1=result(m+s*1+(P-1)*(interval_width+1) :m+s*1+(P-1)*(interval_width+1)+width,n+(Q-1)*(interval_length+1):n+(Q-1)*(interval_length+1)+length);
sum1=sum(sum(a1));
a2(P,Q)=sum1;
end
end
a2(a2<180)=1;
a2(a2>=181)=0;
result6_10=a2; %存储6-10题的结果
%第11-15题区域的检测
for P=1:4
for Q=1:5
a1=result(m+(P-1)*(interval_width+1) :m+(P-1)*(interval_width+1)+width,n+t*1+(Q-1)*(interval_length+1):n+t*1+(Q-1)*(interval_length+1)+length);
sum1=sum(sum(a1));
a2(P,Q)=sum1;
end
end
a2(a2<224)=1;
a2(a2>=225)=0;
result11_15=a2; %存储11-15题的结果
%第16-20题区域的检测
for P=1:4
for Q=1:5
a1=result(m+s*1+(P-1)*(interval_width+1) :m+s*1+(P-1)*(interval_width+1)+width,n+t*1+(Q-1)*(interval_length+1):n+t*1+(Q-1)*(interval_length+1)+length);
sum1=sum(sum(a1));
a2(P,Q)=sum1;
end
end
a2(a2<240)=1;
a2(a2>=241)=0;
result16_20=a2; %存储16-20题的结果
%第21-25题区域的检测
for P=1:4
for Q=1:5
a1=result(m+s*2+(P-1)*(interval_width+1) :m+s*2+(P-1)*(interval_width+1)+width,n+t*1+(Q-1)*(interval_length+1):n+t*1+(Q-1)*(interval_length+1)+length);
sum1=sum(sum(a1));
a2(P,Q)=sum1;
end
end
a2(a2<200)=1;
a2(a2>=201)=0;
result21_25=a2; %存储21-25题的结果
%第26-30题区域的检测
for P=1:4
for Q=1:5
a1=result(m+s*3+(P-1)*(interval_width+1) :m+s*3+(P-1)*(interval_width+1)+width,n+t*1+(Q-1)*(interval_length+1):n+t*1+(Q-1)*(interval_length+1)+length);
sum1=sum(sum(a1));
a2(P,Q)=sum1;
end
end
a2(a2<224)=1;
a2(a2>=225)=0;
result26_30=a2; %存储26-30题的结果
% %第31-35题区域的检测
% for P=1:4
% for Q=1:5
% a1=result(m+s*4+(P-1)*(interval_width+1) :m+s*4+(P-1)*(interval_width+1)+width,n+t*1+(Q-1)*(interval_length+1):n+t*1+(Q-1)*(interval_length+1)+length);
% sum1=sum(sum(a1));
% a2(P,Q)=sum1;
%
% end
版本:2014a
【答题卡识别】基于matlab形态学答题卡识别【含Matlab源码 1135期】
标签:步骤 nes 统计 形状 旋转 读取 pre 概述 interval
原文地址:https://www.cnblogs.com/homeofmatlab/p/14999244.html