这是我的函数图像
function pic = xylimit(pic)
[m, n] = size(pic); %纵向扫描
Ycount = zeros(1,m);
for i = 1:m
Ycount(i) = sum(pic(i,:)); %获取每行的像素点数
end
Ybottom = m; %底部定界
Yvalue = Ycount(Ybottom); %记录底部的像素
while(Yvalue < 3) %将像素跨度小于3的点视为噪声点
Ybottom = Ybottom - 1;
Yvalue = Ycount(Ybottom);
end
Yceil = 1; %顶部定界
Yvalue = Ycount(Yceil);
while(Yvalue < 3) %将像素跨度小于3的点视为噪声点
Yceil = Yceil + 1;
Yvalue = Ycount(Yceil);
end
Xcount = zeros(1,n); %横向扫描
for j = 1:n
Xcount(j) = sum(pic(:,j)); %获取每列的像素点个数
end
Xleft = 1; %左侧定界
Xvalue = Xcount(Xleft);
while(Xvalue < 2)
Xleft = Xleft + 1;
Xvalue = Xcount(Xleft);
end
Xright = n; %右侧定界
Xvalue = Xcount(Xright);
while(Xvalue < 2)
Xright = Xright - 1;
Xvalue = Xcount(Xright);
end
pic = pic(Yceil:Ybottom,Xleft:Xright); %边界界定
m = size(pic, 1); % 返回图像行数
Ycount = zeros(1, m); % 1 x m 的矩阵
for i = 1:m
Ycount(i) = sum(pic(i, :)); % 获取每行白点的总数
end
lenYcount = length(Ycount);
Yflag = zeros(1, lenYcount);
for k = 1:lenYcount-2 % 去除像素跨度小于 3 的点,将其置为黑点
if Ycount(k) < 3 && Ycount(k+1) < 3 && Ycount(k+2) < 3
Yflag(k) = 1;
end
end
for k = lenYcount:1+2
if Ycount(k) < 3 && Ycount(k-1) < 3 && Ycount(k-2) < 3
Yflag(k) = 1;
end
end
Yflag2 = [0 Yflag(1:end-1)]; % 去除 flag 的最后一项
Yflag3 = abs(Yflag - Yflag2); % 做差分运算,将前一行与后一行的 flag 做比较
[R, row] = find(Yflag3 == 1); % 找突变位置
row = [1 row m]; % 调整突变位置点
row1 = zeros(1, length(row)/2); % 截取图像的起始位置向量
row2 = row1; % 截取图像的终止位置向量
for k = 1:length(row)
if mod(k, 2) == 1 % 奇数为起始
row1((k+1)/2) = row(k); % 黑到白
else % 偶数为终止
row2(k/2) = row(k); % 白到黑
end
end
pic2 = pic(row1(1):row2(1), :); % 截取第一行字符
alpha = 1024 / size(pic2, 2); % 计算放缩比例
if alpha >= 1
% 不需要调整图片大小,直接使用原始图片作为基准
pic2 = pic2;
else
% 调整第一行字符图片大小,作为基准
pic2 = imresize(pic2, alpha);
end % 调整第一行字符图片大小,作为基准
for k = 2:length(row)/2
pictemp = imresize(pic(row1(k):row2(k), :), [size(pic2, 1), size(pic2, 2)]);
pic2 = cat(2, pic2, pictemp); % 横向连接图像块
end
n = size(pic, 2); % 返回图像列数
Xcount = zeros(1, n); % 1xN的矩阵
for j = 1:n
Xcount(j) = sum(pic(:, j)); % 每列白点的总数
end
lenxcount = length(Xcount);
Xflag = zeros(1, lenxcount);
for k = 1:lenxcount-2 % 去除噪声点
if Xcount(k) < 3 && Xcount(k+1) < 3 && Xcount(k+2) < 3
Xflag(k) = 1;
end
end
for k = lenxcount:1+2
if Xcount(k) < 3 && Xcount(k-1) < 3 && Xcount(k-2) < 3
Xflag(k) = 1;
end
end
Xflag2 = [0, Xflag(1:end-1)]; % 去掉flag最后一项
Xflag3 = abs(Xflag - Xflag2); % 比较两项
[CO, col] = find(Xflag3 == 1); % 找出突变位置
col = [1, col, size(pic, 2)]; % 调整突变位置
coltemp = col(2:end) - col(1:end-1);
[IND, ind] = find(coltemp < 3); % 去除噪声点
col(ind) = 0;
col(ind+1) = 0;
col = col(col > 0);
col1 = zeros(1, length(col)/2); % 截取起始位置
col2 = col1; % 截取终止位置向量
for k = 1:length(col)
if mod(k, 2) == 1 % 奇数为起始
col1((k+1)/2) = col(k);
else % 偶数为终止
col2(k/2) = col(k); % 白到黑
end
end
picnum2 = length(col)/2;
picnum2 = min(picnum2, 50); % 限制汉字数量不超过50个
piccell2 = cell(1, picnum2);
% 获取图片的高度和宽度
[height, width] = size(pic);
for k = 1:picnum2
% 计算当前汉字的左右边界
left = floor((k - 1) * width / picnum2) + 1;
right = floor(k * width / picnum2);
% 截取当前汉字的图像
piccell2{k} = pic(:, left:right);
% 限定图像区域
piccell2{k} = xylimit(piccell2{k});
% 调整图像大小
piccell2{k} = imresize(piccell2{k}, [32, 32]);
end
if mod(picnum2, 8)
rownum = ceil(picnum2/8) + 1;
else
rownum = picnum2/8;
end
for k = 1:picnum2
mstr = strcat(int2str(500+k), '.bmp');
imwrite(piccell2{k}, mstr); % 把切分出来的文字保存为BMP文件
end
end