图像处理 C语言 文本图像的字符分割

这个程序的功能是把文本图片里面的文字 进行 分割,便于文字识别(这也是熬了一夜啊)

这个算法完全是自己设计的;

算法步骤:

1、 扫描每行白点的个数;累加起来

for(i=0;i<img.height;i++)                    //img.height 原图高度

  {

    for(j=0;j<img.width;j++)                 //img.width 原图宽度

  {

if(temp1[i*img.width+j]==255)        //原图数据存放在temp中temp是一位数组

 xnum[i]++;                       //累加每行出现的白点数存放在xnum[]中

  }

 }

2、   根据每行的累加值可以找出每行字符上下两层的边界

for(i=0;i<img.height;i++)

{

   if(flag==0)                     //flag 用来标记

{

  if(xnum[i]>10)            //当出现白点数大于10个时,把相应行作为这行文字的上边缘

  {

  x1[xn]=i;                //x1[xn]记录xn行字符的上边界

  flag=1;

  }

}

if(flag==1)

{

  if(xnum[i]==0) //扫描上边界后继续扫描当出现某行白点为0时,即为这行文字下边缘

{

x2[xn]=i;     //x2[xn]记录xn行字符的下边界

                 flag=0;

xn++;        //xn 用来记录第几行;

}

}

}

     

 

3、 填充每行每个字所占的空间,使其全为白色

     for(m=0;m<xn;m++)                     //xn为第xn行字符串

for(i=x1;i<=x2;i++)            //行    覆盖文字区域   成为矩形;

{

for(j=0;j<img.width;j++)       

{

if(*(temp1+img.width*i+j)==255)//处理后的数据放在temp中

{

  for(k=x1;k<=x2;k++)     //x2记录m行字符的下边界

         *(temp+img.width*k+j)=255;    //x1记录m行字符的下边界

  }

}

}

4、利用sobel算子边缘检测使其成为方框,即为文字的边界

for(i =0; i<=img.height-1; i++) //sob算子边缘检测;取出边界;

{

for(j=0;j<=img.width-1;j++)//由于使用2×2的模板,为防止越界,所以不处理最下边和最右边的两列像素

{

  if(i==img.height-1)

temp2[i*img.width+j]=0; //边缘检测后的数据存放在temp2数组中

else if(j==img.width-1)

temp2[i*img.width+j]=0;

else
{

  p1[0] = (byte)*(temp+i*img.width+j);//p1[0]p1[2]p1[2]p1[3]表示某个像

p1[1] = (byte)*(temp+i*img.width+j+1);//素周围四个像素的灰度值

p1[2] = (byte)*(temp+(i+1)*img.width+j);

p1[3] = (byte)*(temp+(i+1)*img.width+j+1);

  result = sqrt(( p1[0] - p1[3] )*( p1[0] - p1[3] )+(p1[1] - p1[2] )*( p1[1] - p1[2] ));                                           //边缘检测算子

if(result>0)

result=255;

temp2[i*img.width+j] = (byte)result; //存在temp2中

}

}

}

 

4、 最终图像为

  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
在C语言中进行数字图像处理,你可以使用一些专门为图像处理设计的库或者自己实现一些基本的图像处理算法。以下是一个简单的示例代码,演示如何在C语言中实现图像灰度化处理: ```c #include <stdio.h> #include <stdlib.h> #include <stdint.h> typedef struct { uint8_t r, g, b; } RGBPixel; void rgb2gray(RGBPixel* rgbImage, uint8_t* grayImage, int width, int height) { for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { // 使用加权平均法将RGB图像转换为灰度图像 uint8_t grayValue = (uint8_t)(0.299 * rgbImage[i * width + j].r + 0.587 * rgbImage[i * width + j].g + 0.114 * rgbImage[i * width + j].b); grayImage[i * width + j] = grayValue; } } } int main() { // 假设图像大小为100x100 int width = 100; int height = 100; // 分配RGB图像和灰度图像的内存空间 RGBPixel* rgbImage = (RGBPixel*)malloc(width * height * sizeof(RGBPixel)); uint8_t* grayImage = (uint8_t*)malloc(width * height * sizeof(uint8_t)); // 读入RGB图像数据(此处省略,假设已经读入图像数据到rgbImage中) // 将RGB图像转换为灰度图像 rgb2gray(rgbImage, grayImage, width, height); // 处理后的灰度图像可以进行进一步的操作,例如保存至文件或显示出来 // 释放内存 free(rgbImage); free(grayImage); return 0; } ``` 在这个示例中,我们定义了一个`RGBPixel`结构体,用于表示RGB图像的一个像素点。然后,我们实现了一个`rgb2gray()`函数,将RGB图像转换为灰度图像。最后,在`main()`函数中,我们分配了RGB图像和灰度图像的内存空间,并调用`rgb2gray()`函数进行图像处理。 请注意,这只是一个简单的示例,实际的数字图像处理涉及到更多复杂的算法和技术。你可以根据需求选择适当的库或自行实现算法来进行更高级的图像处理操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值