博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
USM锐化之openCV实现,附赠调整对比度函数
阅读量:6229 次
发布时间:2019-06-21

本文共 2694 字,大约阅读时间需要 8 分钟。

  常用Photoshop的玩家都知道Unsharp Mask(USM)锐化,它是一种增强图像边缘的锐化算法,原理在,如果你想使用这个算法,强烈推荐看一下。本文进行一下简单的介绍,USM锐化一共分为三步,第一步生成原始图片src的模糊图片和高对比度图片,记为blur和contrast.第二,把src和blur作差,得到一张差分图片,记为diff,它就是下图的UnsharpMask。然后把src和contras按一定的比例相加,这个比例由diff控制,最终得到锐化图片。USM有一个缺点,锐化后最大和最小的像素值会超过原始图片,如下图红色虚线和白色实线所示。

 
代码如下:
void MyTreasureBox::UnsharpMask(const IplImage* src, IplImage* dst, float amount, float radius, uchar threshold, int contrast){    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
threshold) { //最终图像 = 原始*(1-r) + 高对比*r val.val[k] = ori.val[k] *(100-amount) + hc.val[k] *amount; val.val[k] /= 100; } else { val.val[k] = ori.val[k]; } } cvSet2D(dst, y, x, val); } } cvReleaseImage(&blurimage); cvReleaseImage(&DiffImage);}

 

其中用到一个调整图像对比度的函数

void MyTreasureBox::AdjustContrast(const IplImage* src, IplImage* dst, int contrast){    if (!src)return ;    int imagewidth = src->width;    int imageheight = src->height;    int channel = src->nChannels;    //求原图均值    CvScalar mean = {
0,0,0,0}; for (int y=0; y
-255 && contrast <= 0) { //(1)nRGB = RGB + (RGB - Threshold) * Contrast / 255 // 当增量大于-255且小于0时,直接用上面的公式计算图像像素各分量 //公式中,nRGB表示调整后的R、G、B分量,RGB表示原图R、G、B分量,Threshold为给定的阀值,Contrast为处理过的对比度增量。 for (int y=0; y
0 && contrast <255) { //当增量大于0且小于255时,则先按下面公式(2)处理增量,然后再按上面公式(1)计算对比度: //(2)、nContrast = 255 * 255 / (255 - Contrast) - 255 //公式中的nContrast为处理后的对比度增量,Contrast为给定的对比度增量。 CvScalar nRGB; int nContrast = 255 *255 /(255 - contrast) - 255; for (int y=0; y
mean.val[k]) { rgb.val[k] = 255; } else { rgb.val[k] = 0; } } cvSet2D(dst, y, x, rgb); } } }}

 

转载于:https://www.cnblogs.com/easymind223/archive/2012/07/03/2575277.html

你可能感兴趣的文章
Codeigniter 4.0-dev 版源码学习笔记之五——相对于 3.x 的变化
查看>>
(译 & 转载) 2016 JavaScript 后起之秀
查看>>
GB(一)
查看>>
方面和服务,差别大吗?
查看>>
Infor喜获中国智能制造与电商物流大奖
查看>>
瑞士科学家研发飞行夹克,用户可以像鸟一样任意飞翔
查看>>
互金启示录:流量思维的末路
查看>>
「镁客·请讲」镁伽机器人黄瑜清:有需求没供给,协作机器人市场存在“两极现象”...
查看>>
GoPro 研发无人机意欲如何?
查看>>
Ubuntu 16.04清楚Dash历史记录
查看>>
随机生成数的方法
查看>>
Oracle APEX 系列文章5:在阿里云上打造属于你自己的APEX完整开发环境 (进一步优化)...
查看>>
大型分布式C++框架《二:大包处理过程》
查看>>
携手科技出版巨擎 推动中国IT人才成长 51CTO与人民邮电出版社达成战略合作
查看>>
11g RAC 如何备份OCR,利用备份恢复OCR,ocrdump
查看>>
WCF序列化
查看>>
uCos-III移植到STM32F10x
查看>>
Centos下源码包安装lamp常见的几个小问题
查看>>
angularjs-过滤输入filter
查看>>
angularjs-过滤输入filter
查看>>