直方图绘制和直方图均衡化、局部直方图自适应均衡化
图像LOMO效果(暗处更暗,亮处更亮,产生光晕,虚焦)
图像cartoon效果

#include<opencv2/opencv.hpp>
#include<iostream>using namespace std;
using namespace cv;void lomo(string filename);
void cartoon(string filename);
void drawhist(string filename);
int main()
{drawhist("dsn.tif");lomo("dsn.tif");cartoon("dsn.tif");waitKey(0);return 0;
}void drawhist(string filename) {Mat src = imread(filename);if (src.empty()) {return ;}vector<Mat> bgr;//0:blue,1:green,2:redsplit(src, bgr);Mat b, g, r;b = bgr[0];g = bgr[1];r = bgr.at(2);Mat hist_b, hist_g, hist_r;//存放直方图计算结果float range[] = { 0,256 };int histsize = 256;const float*ranges = { range };//直方图数值计算calcHist(&b, 1, 0, Mat(), hist_b, 1, &histsize, &ranges);calcHist(&g, 1, 0, Mat(), hist_g, 1, &histsize, &ranges);calcHist(&r, 1, 0, Mat(), hist_r, 1, &histsize, &ranges);//建画布int height = 300, width = 500;Mat histImg(height, width, CV_8UC3, Scalar(0, 0, 0));Mat histImg_b(height, width, CV_8UC3, Scalar(0, 0, 0));Mat histImg_g(height, width, CV_8UC3, Scalar(0, 0, 0));Mat histImg_r(height, width, CV_8UC3, Scalar(0, 0, 0));//归一化防溢出normalize(hist_b, hist_b, 0, histImg.rows, NORM_MINMAX, -1, Mat());normalize(hist_g, hist_g, 0, histImg.rows, NORM_MINMAX, -1, Mat());normalize(hist_r, hist_r, 0, histImg.rows, NORM_MINMAX, -1, Mat());int bin_w = cvRound((double)width / height);for (int i = 1; i < hist_b.rows; i++) {//Point q((i - 1)*bin_w, height - cvRound(hist_b.at<float>(i - 1, 0)));//Point h((i)*bin_w, height - cvRound(hist_b.at<float>(i,0)));//line(histImg, q, h, Scalar(255, 0, 0));//画线line(histImg_b, Point((i - 1)*bin_w, height - cvRound(hist_b.at<float>(i - 1, 0))), Point((i)*bin_w, height - cvRound(hist_b.at<float>(i, 0))),Scalar(255, 0, 0), bin_w);line(histImg_g, Point((i - 1)*bin_w, height - cvRound(hist_g.at<float>(i - 1, 0))), Point((i)*bin_w, height - cvRound(hist_g.at<float>(i, 0))),Scalar(0, 255, 0), bin_w);line(histImg_r, Point((i - 1)*bin_w, height - cvRound(hist_r.at<float>(i - 1, 0))), Point((i)*bin_w, height - cvRound(hist_r.at<float>(i, 0))),Scalar(0, 0, 255), bin_w);}histImg = histImg_b + histImg_g + histImg_r;//直方图均衡化和局部直方图自适应均衡化都需要的是当通道的图像Mat grayImg, dst;cvtColor(src, grayImg, COLOR_BGR2GRAY);//直方图均衡化equalizeHist(grayImg, dst);//局部直方图自适应均衡化//createCLAHE(clipLimit:颜色对比度的阈值,titleGridSize:进行像素均衡化的网格大小,即在多少网格下进行直方图的均衡操作//1、实例化自适应直方图均衡化函数cv::Ptr<cv::CLAHE> clahe = createCLAHE(100, Size(10, 10));//2、进行自适应直方图均衡化Mat jubudst;clahe->apply(grayImg, jubudst);waitKey(0);
}void lomo(string filename){Mat src = imread(filename);//Mat src = imread("lena.png");if (src.empty()) {return ;}//Mat src = Mat::zeros(Size(200, 200), CV_8UC3);//circle(src, Point(src.cols / 2, src.rows / 2), src.cols / 4, Scalar(255, 255, 255), -1);const double exponential_e = std::exp(1.0);Mat lut(1, 256, CV_8UC1);Mat result;//uchar* plut = lut.data;for (int i = 0; i < 256; i++) {double x = (double)(i / 256.0);//plut[i] = cvRound(256 * (  1.0  /  (1.0 + pow(exponential_e, -((x - 0.5) / 0.1)))  ) );lut.at<uchar>(i) = cvRound(256 * (1 / (1 + pow(exponential_e, -((x - 0.5) / 0.1)))));//pow(InputArray src, double p, OutputArray dst)}//类似于根据新的计算公式,把原像素值 "映射" 到新像素值上去//2.分离通道std::vector<Mat> bgr;split(src, bgr);//3.调用LUT函数处理红色通道//也可以是蓝色,绿色cv::LUT(bgr[2], lut, bgr[2]);//cv::LUT(bgr[0], lut, bgr[0]);//cv::LUT(bgr[1], lut, bgr[1]);//4.合并通道cv::merge(bgr, result);//5.创建黑暗光环Mat halo(src.size(), CV_32FC3, Scalar(0.3, 0.3, 0.3));//这里画光环宽度应该是-1circle(halo, Point(src.cols / 2, src.rows / 2), src.cols / 3, Scalar(1, 1, 1), -1);//大模糊blur(halo, halo, Size(src.cols / 3, src.rows / 3));//6.将光环放到原图像上去,方法是将两个图像相乘(相乘必须是浮点型,所以需要类型转换)Mat resultf;result.convertTo(resultf, CV_32FC3);cv::multiply(resultf, halo, resultf);resultf.convertTo(result, CV_8UC3);waitKey(0);
}void cartoon(string filename) {Mat src = imread(filename);//Mat src = imread("lena.png");if (src.empty()) {return;}Mat imgMedian;//1、中值滤波器去噪声,根据噪声特性medianBlur(src, imgMedian, 7);// Detect edges with canny//2、消除噪声后,用canny算子检测强边缘Mat imgCanny;Canny(imgMedian, imgCanny, 50, 150);// Dilate(膨胀) the edges使断续的边缘连接Mat kernel = getStructuringElement(MORPH_RECT, Size(2, 2));dilate(imgCanny, imgCanny, kernel);// Scale edges values to 1 and invert values//为防止乘法溢出,先将边缘图像整合到0-1区间imgCanny = imgCanny / 255;imgCanny = 1 - imgCanny;// Use float values to allow multiply between 0 and 1//3、乘法(将边缘图像加到原图像上(如lomo一样))Mat imgCannyf;imgCanny.convertTo(imgCannyf, CV_32FC3);// Blur the edgest to do smooth effect平滑边缘(小模糊)blur(imgCannyf, imgCannyf, Size(5, 5));/** COLOR **///颜色过滤// Apply bilateral filter to homogenizes color//为了得到卡通外观使用bilateralFilter双边滤波滤镜//一种滤波器,在保持边缘的同时降低图像的噪声,通过适当的参数(输入图像,输出图像,像素领域直径d,sigma色值,sigma坐标空间)Mat imgBF;bilateralFilter(src, imgBF, 9, 150.0, 150.0);//当直径(第三个参数)大于5的时候,bilateral开始变慢//当sigma的值大于150的时候,会出现卡通效果// truncate colors//为了更强大的卡通效果,通过乘除像素值将可能的颜色值截断为10Mat result = imgBF / 25;result = result * 25;/** MERGES COLOR + EDGES **/// Create a 3 channles for edges//必须合并颜色和边缘结果,然后创建一个三通道图像Mat imgCanny3c;Mat cannyChannels[] = { imgCannyf, imgCannyf, imgCannyf };merge(cannyChannels, 3, imgCanny3c);//合并// Convert color result to floatMat resultf;result.convertTo(resultf, CV_32FC3);// Multiply color and edges matricesmultiply(resultf, imgCanny3c, resultf);// convert to 8 bits colorresultf.convertTo(result, CV_8UC3);waitKey(0);
}

opencv直方图,lomo,cartoon相关推荐

  1. OpenCV直方图比较Histogram Comparison

    OpenCV直方图比较Histogram Comparison 直方图比较Histogram Comparison 目标 理论 代码 这个程序做什么? 解释 结果 直方图比较Histogram Com ...

  2. OpenCV学习-P29-P32 Opencv直方图均衡化、掩膜

    OpenCV学习-P29-P32 Opencv直方图均衡化及掩膜 1 直方图 2 直方图均衡化 3 直方图自适应均衡化 1 直方图 直方图原理:统计图像各个灰度区间的像素数 cv2.calcHist( ...

  3. OpenCV基础(16)OpenCV直方图均衡化和自适应直方图均衡化(CLAHE)

    在本教程中,您将学习使用OpenCV实现直方图均衡化和自适应直方图均衡化(CLAHE). 直方图均衡化是一种基本的图像处理技术,通过更新图像直方图的像素强度分布来调整图像的全局对比度.这样做可以使低对 ...

  4. Python,OpenCV直方图均衡化以提高图像对比度

    Python,OpenCV直方图均衡化以提高图像对比度 1. 效果图 2. 原理 2.1 直方图均衡化应用 2.2 直方图均衡化分类 3. 源代码 参考 这篇博客将介绍直方图均衡化(全局 & ...

  5. OpenCV 直方图的计算和绘制

    图像直方图 是用以表示数字图像中亮度分布的直方图,标绘了图像中每个亮度值的像素个数.这种直方图中,横坐标的左侧为较暗的区域,而右侧为较亮的区域.因此一张较暗图片的直方图中的数据多集中于左侧和中间部分, ...

  6. OpenCV直方图计算Histogram Calculation

    OpenCV直方图均衡Histogram Equalization 直方图均衡Histogram Equalization 目标 什么是直方图? OpenCV为您提供什么 代码 解释 结果 直方图均衡 ...

  7. opencv 直方图_OpenCV之图像直方图反向投影

    python代码: import cv2 as cv import numpy as np from matplotlib import pyplot as pltdef back_projectio ...

  8. [Python图像处理] 三十七.OpenCV直方图统计两万字详解(掩膜直方图、灰度直方图对比、黑夜白天预测)

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...

  9. python opencv直方图_【python opencv】直方图均衡

    搜索热词 考虑这样一个图像,它的像素值仅局限于某个特定的值范围.例如,较亮的图像将把所有像素限制在高值上.但是一幅好的图像会有来自图像所有区域的像素.因此,您需要将这个直方图拉伸到两端(如下图所示,来 ...

  10. opencv 直方图反向投影

    转载至:http://www.cnblogs.com/zsb517/archive/2012/06/20/2556508.html 直方图反向投影式通过给定的直方图信息,在图像找到相应的像素分布区域, ...

最新文章

  1. 第十六届全国大学智能车竞赛东北赛区报名信息统计
  2. matlab gui uiwaitbar,MATLAB GUI嵌入进度条(waitBar) | 学步园
  3. JUnit5 @AfterEach注解示例
  4. RedHat yum安装配置命令详解
  5. java中RIGHT的值_java循环遍历, reduce(),reduceRight()方法和Object,keys遍历对象的属性...
  6. 深入理解Java虚拟机(五)之Class类文件的底层结构
  7. 中国十个亡国之君的退位诏书
  8. 【jQueryWEUI】自定义对话框-带有textarea
  9. 【STC单片机】STC15单片机读取MPU6050模块数据并串口输出
  10. 前端50个精美登录注册模板(觉得好用帮我点个赞呗)
  11. 计算机用三角函数时如何用弧度制,弧度制 三角函数的简单应用
  12. win10服务器怎么连接显示器不亮,win10开机后显示器不亮如何解决_win10开机后显示器不亮的处理方法...
  13. 车牌识别之预处理(灰度化,去噪,二值化,分割)
  14. 主流自媒体推广平台有哪些 如何用自媒体引流
  15. java实现 xls转xlsx
  16. 正则表达式的相关操作和验证
  17. 一文带你看懂算术编码(C语言)
  18. 用123BOM工具处理同产品的多个BOM单这是整理研发BOM最好用的工具;是方案公司、产品型号多、同一个产品多个版本子BOM制定单一、准确的研发BOM清单的更好方式
  19. 人工智能技术应用就业方向及前景
  20. 在wordpress开发的网站中添加在线客服咨询功能代码教程

热门文章

  1. 论文阅读--异常检测中实时大数据处理的研究挑战
  2. “所选的用户密钥未在远程主机上注册,请再试一次”问题解决
  3. kuangbin专题十二 HDU1069 Monkey and Banana
  4. C++的重载(overload)与重写(override)
  5. pdf 天线理论与技术 钟顺时_钟顺时. 天线理论与技术[M]. 北京:电子工业出版社, 2011: 290-296....
  6. 用计算机求算术平方根的按键顺序,6.1 .2 用计算器求算术平方根及算术平方根的应用...
  7. 有限元:什么是有限元分析法
  8. 课堂经验值管理小程序_小程序刷新课堂评价 “量子奖状”能量大
  9. 强烈推荐www.wikipedia.org英文版
  10. 美图秀秀修复背光照 瞬间让你光彩照人