opencv白平衡算法之灰度世界法(消除rgb受光照影响)
在用opencv对图像进行处理时,利用颜色定位是常常会接触到的方法,但rgb受光照影响比较严重,转换到hsv xyz等空间也解决不了时,
可以用白平衡算法进行修正,使其发黄、发蓝、发红的照片更加趋于自然光下的图像。
程序代码示例如下:
//该代码实现白平衡算法中的灰度世界法,能有效改善图像发红发蓝发绿的现象;
#include 《opencv2/opencv.hpp》
using namespace cv;
int main()
{
mat g_srcimage,dstimage;
vector《mat》 g_vchannels;
g_srcimage = imread(“c:/users/administrator/desktop/区分高架定位/01.jpg”);
imshow(“原图”,g_srcimage);
//waitkey(0);
//分离通道
split(g_srcimage,g_vchannels);
mat imagebluechannel = g_vchannels.at(0);
mat imagegreenchannel = g_vchannels.at(1);
mat imageredchannel = g_vchannels.at(2);
double imagebluechannelavg=0;
double imagegreenchannelavg=0;
double imageredchannelavg=0;
//求各通道的平均值
imagebluechannelavg = mean(imagebluechannel)[0];
imagegreenchannelavg = mean(imagegreenchannel)[0];
imageredchannelavg = mean(imageredchannel)[0];
//求出个通道所占增益
double k = (imageredchannelavg+imagegreenchannelavg+imageredchannelavg)/3;
double kb = k/imagebluechannelavg;
double kg = k/imagegreenchannelavg;
double kr = k/imageredchannelavg;
//更新白平衡后的各通道bgr值
addweighted(imagebluechannel,kb,0,0,0,imagebluechannel);
addweighted(imagegreenchannel,kg,0,0,0,imagegreenchannel);
addweighted(imageredchannel,kr,0,0,0,imageredchannel);
merge(g_vchannels,dstimage);//图像各通道合并
imshow(“白平衡后图”,dstimage);
waitkey(0);
return 0;
}
opencv实现马赛克和毛玻璃滤镜效果
一、马赛克效果
马赛克的实现原理是把图像上某个像素点一定范围邻域内的所有点用邻域内随机选取的一个像素点的颜色代替,这样可以模糊细节,但是可以保留大体的轮廓。
以下opencv程序实现马赛克效果,通过鼠标左键在图像上划定马赛克的矩形框。
[cpp] view plain copy print?
#include 《corecore.hpp》
#include 《highguihighgui.hpp》
using namespace cv;
mat imagesourcecopy; //原始图像
mat imagesource; //原始图像拷贝
int neightbourhood = 9; //马赛克上每个方框的像素大小
rng rng;
int randomnum; //邻域内随机值
point ptl; //左键按下时坐标
point ptr; //右键按下时坐标
//鼠标回掉函数
void onmouse(int event, int x, int y, int flag, void *ustg);
int main()
{
imagesourcecopy = imread(“test.jpg”);
imagesource = imagesourcecopy.clone();
//imshow(“马赛克”, imagesourcecopy);
namedwindow(“马赛克”);
setmousecallback(“马赛克”, onmouse);
waitkey();
}
void onmouse(int event, int x, int y, int flag, void *ustg)
{
if (event == cv_event_lbuttondown)
{
ptl = point(x, y);
}
if (event == cv_event_lbuttonup)
{
//对鼠标画出的矩形框超出图像范围做处理,否则会越界崩溃
x 》 imagesource.cols - 2 * neightbourhood ? x = imagesource.cols - 2 * neightbourhood : x = x;
y 》 imagesource.rows - 2 * neightbourhood ? y = imagesource.rows - 2 * neightbourhood : y = y;
//对鼠标从右下往右上画矩形框的情况做处理
ptr = point(x, y);
point pt = ptr;
ptr.x 《 ptl.x ? ptr = ptl, ptl = pt : ptr = ptr;
for (int i = 0; i 《 ptr.y - ptl.y; i += neightbourhood)
{
for (int j = 0; j 《 ptr.x - ptl.x; j += neightbourhood)
{
randomnum = rng.uniform(-neightbourhood / 2, neightbourhood / 2);
rect rect = rect(j + neightbourhood + ptl.x, i + neightbourhood + ptl.y, neightbourhood, neightbourhood);
mat roi = imagesourcecopy(rect);
scalar sca = scalar(
imagesource.at《vec3b》(i + randomnum + ptl.y, j + randomnum + ptl.x)[0],
imagesource.at《vec3b》(i + randomnum + ptl.y, j + randomnum + ptl.x)[1],
imagesource.at《vec3b》(i + randomnum + ptl.y, j + randomnum + ptl.x)[2]);
mat roicopy = mat(rect.size(), cv_8uc3, sca);
roicopy.copyto(roi);
}
}
}
imshow(“马赛克”, imagesourcecopy);
waitkey();
}
可以通过改变程序中neightbourhood参数的大小调整小矩形快的大小,实现效果:
二、毛玻璃效果
毛玻璃效果的实现通过用像素点邻域内随机一个像素点的颜色替代当前像素点的颜色实现。
[cpp] view plain copy print?
#include 《corecore.hpp》
#include 《highguihighgui.hpp》
using namespace cv;
int main()
{
mat imagesource = imread(“test.jpg”);
mat imageresult = imagesource.clone();
rng rng;
int randomnum;
int number = 5;
for (int i = 0; i 《 imagesource.rows - number; i++)
for (int j = 0; j 《 imagesource.cols - number; j++)
{
randomnum = rng.uniform(0, number);
imageresult.at《vec3b》(i, j)[0] = imagesource.at《vec3b》(i + randomnum, j + randomnum)[0];
imageresult.at《vec3b》(i, j)[1] = imagesource.at《vec3b》(i + randomnum, j + randomnum)[1];
imageresult.at《vec3b》(i, j)[2] = imagesource.at《vec3b》(i + randomnum, j + randomnum)[2];
}
imshow(“毛玻璃效果”, imageresult);
waitkey();
}
实现效果:
IMX6ULL正点原子开发板LED驱动
便携式系统开关电源PCB排版技术
安森美针对充电电池的低成本CCR充电解决方案
三大运营商将于11月底之前在全国范围内提供携号转网服务
可穿戴设备集成物联网解决方案如何帮助医疗保健行业应对疫情
OpenCV白平衡算法之灰度世界法_OpenCV实现马赛克和毛玻璃滤镜效果
三星48.9寸超“长”电竞显示器开卖 14999元量子点技术加持
C# 中的 Object 虚方法 怎样重写
场效应管怎么测量好坏
高通:采用1亿像素传感器的智能手机摄像头预计今年年底问世!
220V单相电机电容器好坏的判断方法(二)
联想YOGAS730评测 内外兼修的移动伴侣
口罩过滤测试仪简介
多尼卡牵手Enter Air,并拿下在海外改装市场首次EASA取证
第三代半导体功率器件在新能源汽车应用中的两大关键因素
如何识别指纹锁的拒绝率和误识别率
多功能物联网表在物联网应用
安达发|SRM供应商需求管理解决方案
GEP在变压器故障诊断中的应用
TPK推出可任意拉伸的3D曲面触控产品成为行业新主流