http://blog.csdn.net/kezunhai
素描(Sketch)对于很多人来说并不陌生,在高校里常常会遇到一些艺术系的学生在校园里的某个角落里勾勾画画,简单的几个线条就勾勒出一幅意境优美的画面。还记得曾经有个朋友坐在草坪小画图书馆前的那个古藤老树的情景。其实,通过图像的简单处理,也很容易处理出类似素描的效果。灰度值的大小如同铅笔的轻重,线条则表现为图像中灰度的突变。在前面介绍的多种Photoshop算法实现中,其实都可以实现素描的效果。
如将拉普拉斯锐化算法的处理稍微改下,如下:
void PhotoShop::Sketch(Mat& img, Mat& dst) { if ( dst.empty()) dst.create(img.rows, img.cols, img.type()); int height = img.rows; int width = img.cols; int chns = img.channels(); int border = 1; int i, j, k; for ( i=border; i<height-border; i++) { unsigned char* dstData = (unsigned char*)dst.data + dst.step*i; for ( j=border; j<width-border; j++) { for ( k=0; k<chns; k++) { int sum = 8*getPixel(img, i, j, k) - getPixel(img, i-1, j-1, k) - getPixel(img, i-1, j, k) - getPixel(img, i-1, j+1, k) - getPixel(img, i, j-1, k) - getPixel(img, i, j+1, k) - getPixel(img, i+1, j-1, k) - getPixel(img, i+1, j, k) - getPixel(img, i+1, j+1, k) ; //dstData[j*chns+k] = saturate_cast<uchar>(dstData[j*chns+k] + sum); dstData[j*chns+k] = saturate_cast<uchar>(sum) ; } } } }测试效果如图:
再如将输入图像通过高斯模糊处理后,再用原图减去高斯模糊图像,则得到如下图:
再如将我们前面介绍的八方向浮雕算法稍作修改,修改成下面这样:
void PhotoShop::DiamondEmboss(Mat& img, Mat& dst, EMBOSS_DIRECTION Ed /* = SE */,int offset /* = 127 */) { if ( dst.empty()) dst.create(img.rows, img.cols, img.type()); int height = img.rows; int width = img.cols; int chns = img.channels(); int border = 1; int i, j, k, sum; int ioffset = 0; // 根据方位来偏移 int joffset = 0; switch(Ed) { case N: ioffset = -1; joffset = 0; break; case NE: ioffset = -1; joffset = 1; break; case E: ioffset = 0; joffset = 1; break; case SE: ioffset = 1; joffset = 1; break; case S: ioffset = 1; joffset = 0; break; case SW: ioffset = 1; joffset = -1; break; case W: ioffset = 0; joffset = -1; break; case NW: ioffset = -1; joffset = -1; default: ioffset = 1; joffset = 1; break; } for ( i= border; i<height-border; ++i) { unsigned char* dstData = (unsigned char*)dst.data+dst.step*i; for ( j=border; j<width-border; ++j) { for ( k=0; k<chns; k++) { sum = getPixel(img, i, j, k) - getPixel(img, i-ioffset, j-joffset, k) +offset; dstData[j*chns+k] = saturate_cast<uchar>(sum); } } } }
就可以得到多种不同特征的素描图:
其实,素描效果主要是通过中心像素与周围像素的灰度值的比较来得到的,如果中心像素值与周围像素的差异较大,则认为是具有线条的地方,用白色点来表示,否则用黑色点表示。在我们前面介绍的很多Photoshop算法都是采用类似思想实现的,只需稍作效果就可以达到这种效果(如模板、锐化、模糊等)。