OpenCV掩码、blending、改变对比度和亮度、随机发生器和绘图
掩码
一般来说是对某个像素邻域内的几个像素进行相应的操作实现对图像的滤波等操作。
0 | -1 | 0 |
---|---|---|
-1 | 5 | -1 |
0 | -1 | 0 |
例如上面的这个掩码核,使用它来对整副图像进行操作。具体代码如下:
const uchar* pre;const uchar* courrent;const uchar* next;for(int i = 1;i < height-1;i++){pre = src.ptr<uchar>(i-1);courrent = src.ptr<uchar>(i);next = src.ptr<uchar>(i+1);for(int j = 1;j < width-1;j++){ dst.at<uchar>(i,j) = saturate_cast<uchar>(5*courrent[j]-courrent[j-1]-courrent[j+1]-pre[j]-next[j]);}}
同样OpenCV给们提供了相应的api使用,不用自己去一点点敲
Mat kernel = (Mat_<char>(3,3) << 0,-1,0,-1,5,-1,0,-1,0);filter2D(src,api_dst,src.depth(),kernel);
效果是一样的。
Blending
两幅图像进行叠加:
g(i,j) = a*f1(i,j) + (1-a)f2(i,j) + b
分为两种情况:
- 两幅图像大小不同,首先对一个图像进行resize,化为两个大小一样,然后在相叠加。
- 两幅图像大小不同,将小的图像直接叠加在大图的某一区域。
第一种情况:
两个大小不一样
resize(icon,icon,Size(map.cols,map.rows));const Vec3b* map_ptr;const Vec3b* icon_ptr;Vec3b* result_ptr; for(int i = 0;i < map.rows-1;i++){ map_ptr = map.ptr<Vec3b>(i);icon_ptr = icon.ptr<Vec3b>(i);result_ptr = result.ptr<Vec3b>(i);for(int j = 0;j < map.cols-1;j++){result_ptr[j][0] = saturate_cast<uchar>(map_ptr[j][0]*0.3+icon_ptr[j][0]*0.7);result_ptr[j][1] = saturate_cast<uchar>(map_ptr[j][1]*0.3+icon_ptr[j][1]*0.7);result_ptr[j][2] = saturate_cast<uchar>(map_ptr[j][2]*0.3+icon_ptr[j][2]*0.7);}}
同样的OpenCV提供了相应的API:
resize(icon,icon,Size(map.cols,map.rows));
addWeighted(map,0.3,icon,0.7,0,result);
第二种情况相对来说实现其来相对来所比较复杂,所以专门写一个函数来进行操作:
Mat Add(const Mat src1,float bate,const Mat src2,float alpha,int x,int y,int width,int height)
{Mat result;src1.copyTo(result);const Vec3b* ptr1;const Vec3b* ptr2;Vec3b* result_ptr;for(int i = 0;i< height-1;i++){ptr1 = src1.ptr<Vec3b>(i+y);ptr2 = src2.ptr<Vec3b>(i);result_ptr = result.ptr<Vec3b>(i+y);for(int j = 0;j < width-1;j++){result_ptr[j+x][0] = saturate_cast<uchar>(ptr1[j+x][0]*bate + ptr2[j][0]*alpha);result_ptr[j+x][1] = saturate_cast<uchar>(ptr1[j+x][1]*bate + ptr2[j][1]*alpha);result_ptr[j+x][2] = saturate_cast<uchar>(ptr1[j+x][2]*bate + ptr2[j][2]*alpha);}}return result;
}
同样的,也有相应的API:
Mat imageROI;imageROI = map(Rect(20,20,icon.cols,icon.rows));addWeighted(icon,0.5,imageROI,0.5,0,imageROI);imshow("result1",map);
改变对比度和亮度
g(i,j) = a* f(i,j) + b
a值用来改变图像的对比度,b值用来改变图像的亮度。
同样的,自定义一个函数来进行对比度和亮度的改变。
Mat Change(const Mat src,float bate,float alpha)
{Mat result = Mat::zeros(src.size(),src.type());const Vec3b* ptr;Vec3b* res_ptr;for(int row = 0;row < src.rows - 1;row++){ptr = src.ptr<Vec3b>(row);res_ptr = result.ptr<Vec3b>(row);for(int col = 0;col < src.cols - 1;col++){res_ptr[col][0] = saturate_cast<uchar>(ptr[col][0] * bate + alpha);res_ptr[col][1] = saturate_cast<uchar>(ptr[col][1] * bate + alpha);res_ptr[col][2] = saturate_cast<uchar>(ptr[col][2] * bate + alpha);}}return result;
}
同样的,也有相应的API供我们使用:
map.convertTo(map,-1,1.0,100);imshow("map2",map);
随机发生器和绘图
随机发生器:
RNG rng(0xffffffff);定义随机发生器的对象,并用0xffffffff来进行初始化。
int x = rng.uniform(start,end);
绘制直线:
line(image,开始点,结束点,Scalar(0,0,0),线宽,类型=8连续);
绘制矩形:
rectangle(image,左上顶点,右下顶点,Scalar(0,0,0),线宽=-1填充,类型=8连续);
有代码如下:
RNG rng(0xffffffff);Mat image = Mat::zeros(500,500,CV_8UC3);imshow("image",image);Scalar color ;Point start_p,end_p;for(int i = 0;i < 100;i++){color = Scalar(rng.uniform(0,255),rng.uniform(0,255),rng.uniform(0,255));start_p.x = rng.uniform(0,500);start_p.y = rng.uniform(0,500);end_p.x = rng.uniform(0,500);end_p.y = rng.uniform(0,500);rectangle(image,start_p,end_p,color,-1,8);}imshow("image",image);
OpenCV掩码、blending、改变对比度和亮度、随机发生器和绘图相关推荐
- 【图像处理】OpenCV系列五 --- 图像对比度、亮度值调整
今天呢,我们一起学习一下,如何调整图像的对比度以及亮度. 一.原理 调整图像亮度与对比度所用的公式 g(i,j) = a * f(i,j) + b 其中,i 和 j 表示像素位于第i行 和 第j列 . ...
- 基于OpenCV调整图像的对比度和亮度
亮度和对比度的调整原理 公式原理: new_image = a*image + beta 即 g(x)=αf(x)+β 其中,α>0 , β 通常被称为 gain 或者 bias 参数,通常这两 ...
- 独家|OpenCV 1.6 改变图像的对比度和亮度!
翻译:陈之炎 校对:吴金迪本文约2500字,建议阅读5分钟本文为大家介绍了OpenCV改变图像的对比度和亮度. 目标 在本教程中, 你将学习到以下内容: 访问像素值; 用零初始化矩阵; 学习CV :: ...
- OpenCV学习:改变图像的对比度和亮度
本实例演示简单地改变图像的对比度和亮度,使用了如下线性变换来实现像素值的遍历操作: The parameters α > 0 and β often called the gain and bi ...
- OpenCV改变图像的对比度和亮度
OpenCV改变图像的对比度和亮度 改变图像的对比度和亮度 目标 理论 图像处理 像素变换 亮度和对比度调整 代码 解释 结果 改变图像的对比度和亮度 目标 在本教程中,您将学习如何: 访问像素值 用 ...
- OpenCV学习笔记之改变图像的对比度和亮度
一.图像对比度和亮度 图像对比度指的是一幅图像中明暗区域最亮的白和最暗的黑之间不同亮度层级的测量,即指一幅图像灰度反差的大小.差异范围越大代表对比越大,差异范围越小代表对比越小,好的对比率120:1就 ...
- OpenCV 【十四】改变图像的对比度和亮度高度关联章节:OpenCV 【十】——Gamma校正 ——图像灰度变化
目录 0 提问 1.1 原理 trick: 1.2 代码 1.3 结果 0 提问 访问像素值 用0初始化矩阵 saturate_cast 是做什么用的,以及它为什么有用 1.1 原理 图像处理 一般来 ...
- 转载:【opencv入门教程之六】创建Trackbar图片对比度、亮度值调整
[OpenCV入门教程之六] 创建Trackbar & 图像对比度.亮度值调整 浅墨_毛星云 2014-03-18 21:43:18 103746 收藏 21 最后发布:2014-03-18 ...
- opencv计算图像亮度调节_OpenCV教程创建Trackbar图像对比度、亮度值调整
这篇文章中我们一起学习了如何在OpenCV中用createTrackbar函数创建和使用轨迹条,以及图像对比度.亮度值的动态调整. 文章首先详细讲解了OpenCV2.0中的新版创建轨迹条的函数crea ...
最新文章
- ping 丢包 网络摄像头_视频监控系统的摄像头掉线看交换机连接注意事项
- GPT-3:人工智能的新突破
- WPF 中动态创建和删除控件
- Oracle的时区问题
- hibernate中的映射文件xxx.hbm.xml详解总结
- oracle用户登录的认证方式
- java反射头文件_编程基础知识——C++能不能支持Java和ObjC的反射?
- Windows和Linux如何使用Java代码实现关闭进程
- Docker折腾手记-安装
- [注]什么是用户?估计90%人不知道
- 用python画分形树的详细解析_基于Python的matplotlib库绘制分形树
- 智能一代云平台(四十二):关于异常的一些事
- server2003 sp1预览与演示
- java list打乱排序_JAVA Collections.shuffle打乱列表
- 2018年线程与多线程面试必知必会内容
- Android权威编程指南读书笔记(1-2章)
- paip.得到程序运行实际命令
- 捷联惯导系统学习6.13(状态估计的误差分配与可观测度分析 )
- k3梅林单线双拨教程_斐讯 K3 路由器刷入 OpenWrt LEDE 固件教程,支持多拨及去广告...
- oracle临时表空间组