前言

这是一个增强图像色彩的demo,基于OpenCV,能很好的增强与锐化图像中的色彩。

色彩增强

1.代码

void colorEnhancement(cv::Mat &src, cv::Mat &dst, int filter)
{cv::Mat orig_img = src.clone();cv::Mat simg;if (orig_img.channels() != 1){cvtColor(orig_img, simg, CV_BGR2GRAY);}else{return;}long int N = simg.rows*simg.cols;int histo_b[256];int histo_g[256];int histo_r[256];for(int i=0; i<256; i++){histo_b[i] = 0;histo_g[i] = 0;histo_r[i] = 0;}cv::Vec3b intensity;for(int i=0; i<simg.rows; i++){for(int j=0; j<simg.cols; j++){intensity = orig_img.at<cv::Vec3b>(i,j);histo_b[intensity.val[0]] = histo_b[intensity.val[0]] + 1;histo_g[intensity.val[1]] = histo_g[intensity.val[1]] + 1;histo_r[intensity.val[2]] = histo_r[intensity.val[2]] + 1;}}for(int i = 1; i<256; i++){histo_b[i] = histo_b[i] + filter * histo_b[i-1];histo_g[i] = histo_g[i] + filter * histo_g[i-1];histo_r[i] = histo_r[i] + filter * histo_r[i-1];}int vmin_b=0;int vmin_g=0;int vmin_r=0;int s1 = 3;int s2 = 3;while(histo_b[vmin_b+1] <= N*s1/100){vmin_b = vmin_b +1;}while(histo_g[vmin_g+1] <= N*s1/100){vmin_g = vmin_g +1;}while(histo_r[vmin_r+1] <= N*s1/100){vmin_r = vmin_r +1;}int vmax_b = 255-1;int vmax_g = 255-1;int vmax_r = 255-1;while(histo_b[vmax_b-1]>(N-((N/100)*s2))){   vmax_b = vmax_b-1;}if(vmax_b < 255-1){vmax_b = vmax_b+1;}while(histo_g[vmax_g-1]>(N-((N/100)*s2))){   vmax_g = vmax_g-1;}if(vmax_g < 255-1){vmax_g = vmax_g+1;}while(histo_r[vmax_r-1]>(N-((N/100)*s2))){   vmax_r = vmax_r-1;}if(vmax_r < 255-1){vmax_r = vmax_r+1;}for(int i=0; i<simg.rows; i++){for(int j=0; j<simg.cols; j++){intensity = orig_img.at<cv::Vec3b>(i,j);if(intensity.val[0]<vmin_b){intensity.val[0] = vmin_b;}if(intensity.val[0]>vmax_b){intensity.val[0]=vmax_b;}if(intensity.val[1]<vmin_g){intensity.val[1] = vmin_g;}if(intensity.val[1]>vmax_g){intensity.val[1]=vmax_g;}if(intensity.val[2]<vmin_r){intensity.val[2] = vmin_r;}if(intensity.val[2]>vmax_r){intensity.val[2]=vmax_r;}orig_img.at<cv::Vec3b>(i,j) = intensity;}}for(int i=0; i<simg.rows; i++){for(int j=0; j<simg.cols; j++){intensity = orig_img.at<cv::Vec3b>(i,j);intensity.val[0] = (intensity.val[0] - vmin_b)*255/(vmax_b-vmin_b);intensity.val[1] = (intensity.val[1] - vmin_g)*255/(vmax_g-vmin_g);intensity.val[2] = (intensity.val[2] - vmin_r)*255/(vmax_r-vmin_r);orig_img.at<cv::Vec3b>(i,j) = intensity;}}   cv::Mat blurred;double sigma = 1;double threshold = 50;double amount = 1;GaussianBlur(orig_img, blurred, cv::Size(), sigma, sigma);cv::Mat lowContrastMask = abs(orig_img - blurred) < threshold;cv::Mat sharpened = orig_img*(1+amount) + blurred*(-amount);orig_img.copyTo(sharpened, lowContrastMask);dst = sharpened.clone();
}

2.运行效果

图像增强——基于OpenCV的图像色彩增强相关推荐

  1. Python基于OpenCV的图像去雾算法[完整源码&部署教程]

    1.图片识别 2.视频展示 [项目分享]Python基于OpenCV的图像去雾算法[完整源码&部署教程]_哔哩哔哩_bilibili 3.算法原理 图像增强算法常见于对图像的亮度.对比度.饱和 ...

  2. 基于OpenCV平滑图像

    基于OpenCV平滑图像也就是图像模糊,本博文介绍使用OpenCV的不同函数通过线性滤波进行图像平滑. cv::blur cv::GaussianBlur (高斯模糊) cv::medianBlur ...

  3. 数字识别java开源_Java基于opencv实现图像数字识别(三)—灰度化和二值化

    Java基于opencv实现图像数字识别(三)-灰度化和二值化 一.灰度化 灰度化:在RGB模型中,如果R=G=B时,则彩色表示灰度颜色,其中R=G=B的值叫灰度值:因此,灰度图像每个像素点只需一个字 ...

  4. Java基于opencv实现图像数字识别(一),java开发面试笔试题

    我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码或搜索下图红色VX号,加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各位一起 ...

  5. 4.3【图像镜像】-------------基于Opencv实现-----图像的镜像变换

     [1]理论知识:         镜像变换又分为水平镜像和垂直镜像,水平镜像即将图像左半部分和右半部分以图像竖直中轴线为中心轴进行兑换,而竖直镜像则是将图像上半部分和下半部分以图像水平中轴线为中 ...

  6. 基于OpenCV实现------图像的转置

    [1]理论基础 图像转置是将图像的x坐标和y坐标互换,图像的大小会随之改变----------即高度和宽度将互换. [2]图像转置的变换公式 因为转置矩阵的逆矩阵仍然是其本身,故转置变换的逆变换具有相 ...

  7. 基于OpenCV实现图像平移

    [1]理论知识 图像平移就是将图像中所有的点按照指定的平移量水平或者垂直移动 [2]完整代码 /*--------------------------------------------------- ...

  8. 基于OpenCV实现图像线性变化

    基础知识: 线性灰度变换函数f(x)是一个一维线性函数 y=f(x)=ax+b 式中:a为线性函数的斜率,b为线性函数在y轴的截距,x表示输入图像的灰度值,y表示输出图像的灰度值. (1) 当a> ...

  9. java图片降噪_Java基于opencv实现图像数字识别(四)—图像降噪

    Java基于opencv实现图像数字识别(四)-图像降噪 我们每一步的工作都是基于前一步的,我们先把我们前面的几个函数封装成一个工具类,以后我们所有的函数都基于这个工具类 这个工具类呢,就一个成员变量 ...

最新文章

  1. 理解和解决Java并发修改异常ConcurrentModificationException(转载)
  2. ubuntu mysql innodb_Ubuntu MYSQL环境搭建
  3. 获取网络时间,在不同时间触发事件
  4. java gc回收机制种类_JAVA的垃圾回收机制(GC)
  5. 小时级的进度监控工具
  6. mysql 日期型中文报错_mysql日期类型默认值'0000-00-00' 报错,是什么问题?
  7. spring boot没有web.xml,如何向嵌入式的servlet容器中注册servlet组件
  8. OpenSIPS替代VOS3000的方案
  9. crontab java job_crontab 定时任务
  10. GDAL源码剖析(十二)之GDAL Warp API使用说明
  11. np.array()函数
  12. MyBatisplus字段名与表名的映射
  13. 互联网和人工智能之间,主要是什么关系?
  14. 我想要申请一个ICP经营许可证,哪个平台能办理呢?
  15. 用JS怎么判断上传文件控件是否未选择文件
  16. 小白零基础C#学习笔记
  17. Validators
  18. Python入门干货经验(免费提供资料)
  19. 台湾代工三十年,“教父”难再寻
  20. 靠智慧教育“飞升”,科大讯飞前路漫漫

热门文章

  1. HashMap 和HashTable区别和实现原理。
  2. java积分签到功能_大河客户端积分商城上线,看新闻就能换取各种超实用奖品,来约...
  3. 统计学习笔记(3)——k近邻法与kd树
  4. 伪共享(false sharing),并发编程无声的性能杀手
  5. 关于错误的那点事——惨不忍睹的错误
  6. cover letter 和response letter的写法
  7. 【年度开源、工具合集】牛津计划,DMTK,Graph Engine…提高你的工作效率!
  8. 【OpenCV】透视变换 Perspective Transformation(续)
  9. 强如 Disruptor 也发生内存溢出?
  10. android 建数据库 SQLite 存储sd 卡或者内存