📄 linethinning.c
字号:
// Ex12
// 线条细化
#include <windows.h>
#include "image32.h"
extern HDC hMemDC;
extern struct IMAGE *image;
extern struct IMAGE *Image[10];
void ColorToGray(int m,int n); // 变灰阶
void ImageCopy(int m,int n); // 图象复制
void Trans1to8(BYTE *sc,int BytesPerLine)
{
int j,m,n;
for (j=BytesPerLine-1;j>-1;j--) {
for (n=7,m=1;n>-1;n--) {
if ((sc[j]) & m) sc[8*j+n]=1;
else sc[8*j+n]=0;
m=m<<1;
}
}
}
void BinaryToGray(int m,int n)
{ // 图象复制 (二值图像转换成256色图像)
int i,wid,hei,bpl,bits,bpln;
BYTE *p1,*p2;
if (Image[m]->hdib==NULL) return;
wid =Image[m]->wid; hei =Image[m]->hei;
bpl =Image[m]->bpl; bits=Image[m]->bitcount;
if (bits>1) return;
ImageCreate(Image[n],wid,hei,8);
bpln =Image[n]->bpl;
p1=(BYTE*) Image[m]->lpbi+40;
p2=(BYTE*) Image[n]->lpbi+40;
memcpy(p2,p1,8);
p1=Image[m]->lpbits;
p2=Image[n]->lpbits;
for (i=0;i<hei;i++) {
memcpy(p2,p1,bpl);
Trans1to8(p2,bpl);
p1+=bpl;
p2+=bpln;
}
}
int Cross(int* f) /* 四邻点处正跳变计数 */
{
int i,sum;
for (i=1,sum=0; i<=7; i+=2) {
if ((!f[i]) && (f[i+1] || f[i+2])) sum++;
}
return(sum);
}
void Hilditch(struct IMAGE * image,int x,int y,int Dx,int Dy)
{
int i,j,k,m,n,flag;
int sum=0, f[10];
char **list;
list=(char**)malloc(Dy*sizeof(char*));
for (i=0;i<Dy;i++) {
list[i]=(char*) malloc(Dx*sizeof(char));
getimage(image,x,y+i,Dx,1,list[i]);
}
i=1;
do {
flag=0;
for (k=1; k<Dy-1; k++) {
for (j=1; j<Dx-1; j++) {
if (list[k][j] != 1) continue;
f[1]=list[k][j+1]; f[2]=list[k-1][j+1];
f[3]=list[k-1][j]; f[4]=list[k-1][j-1];
f[5]=list[k][j-1]; f[6]=list[k+1][j-1];
f[7]=list[k+1][j]; f[8]=list[k+1][j+1];
for (m=1,n=0; m<=8; m++) {
if (f[m]==-i) {
f[m]=1;
n++;
}
else if (f[m]<0) f[m]=0;
}
sum=f[1]+f[3]+f[5]+f[7];
if (sum>=4) continue;
f[9]=f[1];
for (m=1, sum=0; m<=8; m++)
if (f[m]==1) sum++;
if ((sum<=1)||(sum-n==0)) continue;
sum=Cross(f);
if (sum!=1) continue;
if (list[k-1][j]== -i) {
f[3]=0;
sum=Cross(f);
if (sum!=1) continue;
}
if (list[k][j-1]== -i) {
f[5]=0;
sum=Cross(f);
if (sum!=1) continue;
}
setpixel(image,x+j, y+k, 0);
list[k][j]=-i;
flag=1;
}
}
i++;
}
while(flag==1);
for (i=0;i<Dy;i++)
if (list[i]) free(list[i]);
free(list);
}
void LineThinning(HWND hWnd)
{
if ((Image[0]->hdib==NULL)||(Image[0]->bitcount>1)) return;
ClearDDB();
WriteDDB(Image[0], 0, 0, 0, 0,512,512);
BinaryToGray(0,1);
Hilditch(Image[1], 0, 0,Image[1]->wid,Image[1]->hei);
WriteDDB(Image[1], 0,150, 0, 0,512,512);
InvalidateRect(hWnd,NULL,FALSE);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -