USM(unsharp mask)锐化之openCV代码

标签:
杂谈 |
分类: C与OpenCV |
常用Photoshop的玩家都知道USM锐化,它是一种增强图像边缘的锐化算法。USM的原理在这里,如果你想使用这个算法,强烈推荐看一下。此处进行一下简单的介绍:第一步生成原始图片src的模糊图片和高对比度图片,记为blur和contrast.第二,把src和blur作差,得到一张差分图片,记为diff,它就是下图的UnsharpMask。然后把src和contras按一定的比例相加,这个比例由diff控制,最终得到锐化图片。
USM有一个缺点,锐化后最大和最小的像素值会超过原始图片,如上图红色虚线和白色实线所示。
代码如下:
void UnsharpMask(const IplImage* src, IplImage* dst, float amount=80, float radius=5, uchar threshold=0, intcontrast=100)
{
if(!src)return ;
int imagewidth = src->width;
int imageheight = src->height;
int channel = src->nChannels;
IplImage* blurimage = cvCreateImage(cvSize(imagewidth,imageheight), src->depth, channel);
IplImage* DiffImage = cvCreateImage(cvSize(imagewidth,imageheight), 8, channel);
//原图的高对比度图像
IplImage* highcontrast = cvCreateImage(cvSize(imagewidth,imageheight), 8, channel);
AdjustContrast(src, highcontrast, contrast);
//原图的模糊图像
cvSmooth(src, blurimage, CV_GAUSSIAN, radius);
//原图与模糊图作差
for (int y=0; y<imageheight; y++)
{
for (int x=0; x<imagewidth; x++)
{
CvScalar ori = cvGet2D(src, y, x);
CvScalar blur = cvGet2D(blurimage, y, x);
CvScalar val;
val.val[0] = abs(ori.val[0] - blur.val[0]);
val.val[1] = abs(ori.val[1] - blur.val[1]);
val.val[2] = abs(ori.val[2] - blur.val[2]);
{