以下是一个不完美的程序,图像细化后会有毛边,且细化速度极慢,有待改进,求各位大佬改进╰(⇀‸↼)╯
static int erasetable[256]={ /细化图像索引表/
0,0,1,1,0,0,1,1, 1,1,0,1,1,1,0,1,
1,1,0,0,1,1,1,1, 0,0,0,0,0,0,0,1,
0,0,1,1,0,0,1,1, 1,1,0,1,1,1,0,1,
1,1,0,0,1,1,1,1, 0,0,0,0,0,0,0,1,
1,1,0,0,1,1,0,0, 0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
1,1,0,0,1,1,0,0, 1,1,0,1,1,1,0,1,
0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
0,0,1,1,0,0,1,1, 1,1,0,1,1,1,0,1,
1,1,0,0,1,1,1,1, 0,0,0,0,0,0,0,1,
0,0,1,1,0,0,1,1, 1,1,0,1,1,1,0,1,
1,1,0,0,1,1,1,1, 0,0,0,0,0,0,0,0,
1,1,0,0,1,1,0,0, 0,0,0,0,0,0,0,0,
1,1,0,0,1,1,1,1, 0,0,0,0,0,0,0,0,
1,1,0,0,1,1,0,0, 1,1,0,1,1,1,0,0,
1,1,0,0,1,1,1,0, 1,1,0,0,1,0,0,0
};//索引表说明:假定图像的背景是浅色的,二值化后背景是1,目标像素(如文字笔画)是0.
int CVICALLBACK Xi_Hua (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
int x, y, width, height, flag, i, a[1000] = {0}, b[1000] = {0}, sum;
PixelValue pixelValue, pixelValue1, pixelValue2;
Point point, point1, point2;
switch (event)
{
case EVENT_COMMIT:
imaqGetImageSize(SourceImage, &width, &height);
do
{
flag = 0;
//行扫描
for ( i = 0; i < 1000; i++)
a[i] = b[i] = 0;
for (y = 1; y < height - 1; y++)
{
i = 0;
for (x = 1; x < width - 1; x++)
{
sum = 0;
//先判断每一点的邻居,如果都是黑点,则该点不做处理
point1.x = x - 1;
point1.y = y;
imaqGetPixel(SourceImage, point1, &pixelValue1);
point2.x = x + 1;
point2.y = y;
imaqGetPixel(SourceImage, point2, &pixelValue2);
point.x = x;
point.y = y;
imaqGetPixel(SourceImage, point, &pixelValue);
if (pixelValue.grayscale == 255.0 || (pixelValue1.grayscale == 0 && pixelValue2.grayscale == 0))
continue;
//查表记录可处理的点
point.x = x - 1;
point.y = y - 1;
imaqGetPixel(SourceImage, point, &pixelValue);
sum += 1 * pixelValue.grayscale / 255;
point.x = x;
point.y = y - 1;
imaqGetPixel(SourceImage, point, &pixelValue);
sum += 2 * pixelValue.grayscale / 255;
point.x = x + 1;
point.y = y - 1;
imaqGetPixel(SourceImage, point, &pixelValue);
sum += 4 * pixelValue.grayscale / 255;
point.x = x - 1;
point.y = y;
imaqGetPixel(SourceImage, point, &pixelValue);
sum += 8 * pixelValue.grayscale / 255;
point.x = x + 1;
point.y = y;
imaqGetPixel(SourceImage, point, &pixelValue);
sum += 16 * pixelValue.grayscale / 255;
point.x = x - 1;
point.y = y + 1;
imaqGetPixel(SourceImage, point, &pixelValue);
sum += 32 * pixelValue.grayscale / 255;
point.x = x;
point.y = y + 1;
imaqGetPixel(SourceImage, point, &pixelValue);
sum += 64 * pixelValue.grayscale / 255;
point.x = x + 1;
point.y = y + 1;
imaqGetPixel(SourceImage, point, &pixelValue);
sum += 128 * pixelValue.grayscale / 255;
if (erasetable[sum])
{
if (i > 0)
if (a[i - 1] == x - 1 && b[i - 1] == y)
break; //不连续处理
a[i] = x;
b[i] = y;
i++;
}
} //处理目标点
while (i--)
{
point.x = a[i];
point.y = b[i];
pixelValue.grayscale = 255.0;
imaqSetPixel(SourceImage, point, pixelValue);
flag = 1;
}
}
//列扫描
for (i=0;i<1000; i++)
a[i] = b[i] = 0;
for (x = 1; x < width - 1; x++)
{
i = 0;
for (y = 1; y < height - 1; y++)
{
sum = 0;
//先判断每一点的邻居,如果都是黑点,则该点不做处理
point1.x = x;
point1.y = y - 1;
imaqGetPixel(SourceImage, point1, &pixelValue1);
point2.x = x;
point2.y = y + 1;
imaqGetPixel(SourceImage, point2, &pixelValue2);
point.x = x;
point.y = y;
imaqGetPixel(SourceImage, point, &pixelValue);
if (pixelValue.grayscale == 255.0 || (pixelValue1.grayscale == 0 && pixelValue2.grayscale == 0))
continue;
//查表记录可处理的点
point.x = x - 1;
point.y = y - 1;
imaqGetPixel(SourceImage, point, &pixelValue);
sum += 1 * pixelValue.grayscale / 255;
point.x = x;
point.y = y - 1;
imaqGetPixel(SourceImage, point, &pixelValue);
sum += 2 * pixelValue.grayscale / 255;
point.x = x + 1;
point.y = y - 1;
imaqGetPixel(SourceImage, point, &pixelValue);
sum += 4 * pixelValue.grayscale / 255;
point.x = x - 1;
point.y = y;
imaqGetPixel(SourceImage, point, &pixelValue);
sum += 8 * pixelValue.grayscale / 255;
point.x = x + 1;
point.y = y;
imaqGetPixel(SourceImage, point, &pixelValue);
sum += 16 * pixelValue.grayscale / 255;
point.x = x - 1;
point.y = y + 1;
imaqGetPixel(SourceImage, point, &pixelValue);
sum += 32 * pixelValue.grayscale / 255;
point.x = x;
point.y = y + 1;
imaqGetPixel(SourceImage, point, &pixelValue);
sum += 64 * pixelValue.grayscale / 255;
point.x = x + 1;
point.y = y + 1;
imaqGetPixel(SourceImage, point, &pixelValue);
sum += 128 * pixelValue.grayscale /255;
if (erasetable[sum])
{
f (i > 0)
if (a[i - 1] == x && b[i - 1] == y - 1)
break; //不连续处理
a[i] = x;
b[i] = y;
i++;
}
}
//处理目标点
while (i--)
{
point.x = a[i];
point.y = b[i];
pixelValue.grayscale = 255.0;
imaqSetPixel(SourceImage, point, pixelValue);
flag = 1;
}
}
} while (flag);
imaqSetWindowTitle (4, "细化图像");
imaqMoveWindow (4, imaqMakePoint(550,260));
imaqDisplayImage(SourceImage,4, TRUE);
break;
break;
}
return 0;
}
你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答
本次提问扣除的有问必答次数,将会以问答VIP体验卡(1次有问必答机会、商城购买实体图书享受95折优惠)的形式为您补发到账户。
因为有问必答VIP体验卡有效期仅有1天,您在需要使用的时候【私信】联系我,我会为您补发。