求助大神再用piccell2{k} = xylimit(piccell2{k});语句时一直报错,内存不足。可能的原因是程序内存在无限递归。

这是我的函数图像

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

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值