先来看两张对比图,首先是原图。
下面是处理后的效果,其实下图看起来已经不再像是一张拍摄的照片了,更像是手工绘制的。
其实除了对于边缘的描绘外,显然对色彩也需要进行适当处理。
应该还可以有改进的空间,但是毕竟算法的实现方式非常的简单,而且毕竟体现了处理此类问题所应该考虑的基本思想。
下面是我基于MAGICHOUSE平台用C++实现的代码。
函数调用部分
SeaFun::InkSketch(our_image_buffer,temp_imageBuffer,X_image,Y_image);
for(int n=0; n<sum; n+=4)
{
temp_imageBuffer[n] = temp_imageBuffer[n]>0 ? our_image_buffer[n]:temp_imageBuffer[n];
temp_imageBuffer[n+1] = temp_imageBuffer[n+1]>0 ? our_image_buffer[n+1]:temp_imageBuffer[n+1];
temp_imageBuffer[n+2] = temp_imageBuffer[n+2]>0 ? our_image_buffer[n+2]:temp_imageBuffer[n+2];
}
实现部分
static void InkSketch(BYTE* image0, BYTE* image1, unsigned int w, unsigned int h)
{
BYTE** imageBuf0 = CreatImage(image0, w, h);
BYTE** imageBuf1 = CreatImage(image1, w, h);
double scale=2;
int templt[25]={
-1, -1, -1, -1, -1,
-1, -1, -1, -1, -1,
-1, -1, 30, -1, -1,
-1, -1, -1, -1, -1,
-1, -1, -5, -1, -1
};
int x,y;
int a;
for(y=2; y<h-2; y++)
for(x=2; x<w-2; x++)
{
a=TempltExcute(imageBuf0,w,h,templt,5,x,y);
a*= scale;
a = a>255?255:a;
a = a<0?0:a;
SetPixel2(imageBuf1,x,y,a);
}
free(imageBuf0);
free(imageBuf1);
}