-
Notifications
You must be signed in to change notification settings - Fork 2
Description
f = imread('gl_40_76.jpg'); %读原图文件
%f = imread('dh224_b.jpg');
figure(1);imshow(f); %显示原图
g = rgb2gray(f) %彩色图转换为灰度图
figure(2); imshow(g); %显示灰度图
level = graythresh(g); %设定灰度阈值
bw = ~im2bw(g,level); %灰度图转换为二值图
figure(4); imshow(bw); %显示二值图
s = size(bw); %计算矩阵大小
%求图像的列像素累加和
for i = 1:s(2)
gx(i) = 0;
for j = 1:s(1)
gx(i) = gx(i)+ bw(j,i);
end
end
x = 1:s(2);
%line(x, gx,'Color','b'); %显示求和曲线
windowSize = 15; %滤波窗宽
gy = filter(ones(1,windowSize)/windowSize,1,gx); %对曲线进行滑动平均滤波
gy = filter(ones(1,windowSize)/windowSize,1,gy); %再次滤波
gmax = find(diff(sign(diff(gy)))== -2)+1; %求极大值
%line(x, gy,'Color','r'); %绘滤波后的曲线
smax = size(gmax); %极大值点数
ly = 1:s(1) %绘切割竖线
for k = 1:smax(2)
if(k == 1) %左边第一列字两边都划线
lq(1) = gmax(k)-4*windowSize; %左边第一条竖线水平坐标
line(lq(1), ly,'Color','y'); %绘第一条竖线
lq(2) = gmax(k) + windowSize; %第二条竖线的水平坐标
line(lq(2), ly,'Color','y'); %绘第二条竖线
end
lq(k+1) = gmax(k) + windowSize; %其余竖线的水平坐标
line(lq(k+1), ly,'Color','y'); %绘其余的竖线
end
for k = 1:gmax+1 %列字条水平像素累加
for i = 1:s(1)
py(i) = 0;
for j = lq(k):lq(k+1)
py(i) = py(i)+ bw(i,j);
end
end
windowSize = 23; %滤波窗宽
py = filter(ones(1,windowSize)/windowSize,1,py); %对投影曲线滑动滤波
fpy = filter(ones(1,windowSize)/windowSize,1,py); %二次滤波
pmax = find(diff(sign(diff(fpy)))==- 2)+1; %求极大值
psmax = size(pmax); %极值点数
lx = lq(k):lq(k+1);
for m = 1:psmax(2)
hq(m) = pmax(m); %横切线的竖直坐标
line(lx, hq(m), 'Color','r'); %绘横切割线
hold on %保持绘图
end
end