OpenCV掩码、blending、改变对比度和亮度、随机发生器和绘图
生活随笔
收集整理的这篇文章主要介绍了
OpenCV掩码、blending、改变对比度和亮度、随机发生器和绘图
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
掩码
一般来说是对某个像素邻域内的几个像素进行相应的操作实现对图像的滤波等操作。
| -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,化为两个大小一样,然后在相叠加。
- 两幅图像大小不同,将小的图像直接叠加在大图的某一区域。
第一种情况:
两个大小不一样
同样的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值用来改变图像的亮度。
同样的,自定义一个函数来进行对比度和亮度的改变。
同样的,也有相应的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、改变对比度和亮度、随机发生器和绘图的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: Linux系统文件名字体不同的颜色都代表
- 下一篇: mount and fstab的使用(整