图像处理 C语言 文本图像的倾斜校正

程序功能是把一副倾斜的文字图像矫正过来 这个程序,我熬了一夜

1、读取图像,创建结构元素

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

{

for(j=0,n=0;n<img.width*3,j<img.width;n+=3,j++) //24位图像二值化处理img.width原图宽度

{

//gray 根据原图rgb值计算灰度值存在gray

gray= ((float)(img.image[lineBytes*i+n+2])+(float)(*(img.image+lineBytes*i+n+1))+(float)(*(img.image+lineBytes*i+n)))/3; //img.image原图数据lineBytes原图每行实际字节数

if(gray>120)

gray=255;

else gray=0;

grayPic[(img.height-i-1)*img.width+j]=(byte)gray; //经过二值化处理过的数据存放在grayPic中;

}

}


2、对图像进行膨胀处理,将断续的文字连成一条直线,便于直线检测

int num=10; //num 膨胀幅度

//水平方向 膨胀

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

{

for(j=(num-1)/2;j<(img.width-(num-1)/2)*3;j++)

{

for(k=-(num-1)/2;k<=(num-1)/2;k++)

{

n=*(grayPic+img.width*i+j+k); //从二值化数据取出数据

if(n==255)

{

*(temp3+img.width*i+j)=255; //水平方向膨胀的结果存在temp3

break;

}

}

}

}

num=10;

//对水平膨胀后进行垂直方向膨胀

for(i=(num-1)/2;i<img.height-(num-1)/2;i++)//img.height 原图高度

{

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

{

for(k=-(num-1)/2;k<=(num-1)/2;k++)

{

n=*(temp3+img.width*(i+k)+j);//temp3中即水平膨胀后取出数据

if(n==255)

{

*(grayPic+img.width*i+j)=255;//膨胀的结果存在grayPic

break;

}

}

}

}


3、膨胀后边缘检测

for(i=3;i<img.height-2;i++) //img.height 原图高度 img.width原图宽度

for(j=3;j<img.width-2;j++) //logNum记录经过计算后的相应像素值

{ //grayPic 膨胀后数据存放的空间

logNum=16*grayPic[i*img.width+j]-grayPic[(i-2)*img.width+j]-grayPic[(i-1)*img.width+j-1]-2*grayPic[(i-1)*img.width+j]-grayPic[(i-1)*img.width+j+1]-grayPic[i*img.width+j-2]-2*grayPic[i*img.width+j-1]-2*grayPic[i*img.width+j+1]-grayPic[i*img.width+j+2]-grayPic[(i+1)*img.width+j-1]-2*grayPic[(i+1)*img.width+j]-grayPic[(i+1)*img.width+j+1]-grayPic[(i+2)*img.width+j];

if(logNum > 0)

lpDIBBits[i*img.width+j]=255;//lpDIBBits //边缘检测后存放的空间

else

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

}


4、对边缘点进行hough变换,找到最长线段的角度kmax

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

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

{

if(lpDIBBits[i*img.width+j]==255) //对边缘检测后的数据(存在lpDIBBits中)进行hough变化

{

for(k=1;k<ma;k++) //ma=180

{

p=(int)(i*cos(pi*k/180)+j*sin(pi*k/180));//p hough变换中距离参数

p=(int)(p/2+mp/2); //p值优化防止为负

npp[k][p]=npp[k][p]++; //npp对变换域中对应重复出现的点累加

}

}

}

kmax=0; //最长直线的角度

pmax=0; //最长直线的距离

n=0; //这一部分为寻找最长直线

for(i=1;i<ma;i++) //ma=180

for(j=1;j<mp;j++) //mp为原图对角线距离

{

if(npp[i][j]>yuzhi) //找出最长直线 yuzhi为中间变量用于比较

{

yuzhi=npp[i][j];

kmax=i; //记录最长直线的角度

pmax=j; //记录最长直线的距离

}

}


5、得到直线角度kmax,实际应该旋转地角度为kmax

6、用旋转函数旋转图像,并显示图像

RotateDIB(img,kmax);//RotateDIB为旋转函数,img中存放原图数据,kmax为旋转角度


若 感兴趣 可以联系 交流

  • 15
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
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()`函数进行图像处理。 请注意,这只是一个简单的示例,实际的数字图像处理涉及到更多复杂的算法和技术。你可以根据需求选择适当的库或自行实现算法来进行更高级的图像处理操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值