首页 > 其他 > 详细

OpenCV学习笔记(四) 图像操作

时间:2014-03-03 14:29:21      阅读:940      评论:0      收藏:0      [点我收藏+]

转自:OpenCV Tutorial: core 模块. 核心功能

利用掩码(kernel mask)简单滤波:filter2D

矩阵的掩码操作很简单。其思想是:根据掩码矩阵(也称作核)重新计算图像中每个像素的值。掩码矩阵中的值表示近邻像素值(包括该像素自身的值)对新像素值有多大影响。从数学观点看,我们用自己设置的权值,对像素邻域内的值做了个加权平均。

以下是利用filter2D函数实现Laplace filter来加强图像对比度的实例(samples\cpp\tutorial_code\core\mat_mask_operations):

1
2
3
4
Mat kern = (Mat_<char>(3,3) <<  0, -1,  0,
                               -1,  5, -1,
                                0, -1,  0);
filter2D(I, K, I.depth(), kern );

bubuko.com,布布扣

改变图像对比度和亮度:convertTo

可以把 bubuko.com,布布扣 看成源图像像素,把 bubuko.com,布布扣 看成输出图像像素。这样一来,调整亮度和对比度的方法可表示为:bubuko.com,布布扣

两个参数 bubuko.com,布布扣 和 bubuko.com,布布扣 一般称作 增益 和 偏置 参数。我们往往用这两个参数来分别控制 对比度 和 亮度 。

OpenCV很多函数都使用到这两个参数(如addWeighted也有这两个参数),这里可直接使用convertTo函数执行:

1
original_image.convertTo(new_image, -1, alpha, beta);

取参数 bubuko.com,布布扣 和 bubuko.com,布布扣:

bubuko.com,布布扣

对两幅图求和:addWeighted

公式为:bubuko.com,布布扣

1
addWeighted( src1, alpha, src2, beta, gamma, dst);

alpha=0.7, beta=0.4:

bubuko.com,布布扣

单通道操作:split与merge

利用split可将多通道的Mat转化为一个vector对象,每个分量是原Mat的一个通道。

1
2
3
4
5
Mat image1=imread("image.jpg"), image2=imread("image2.jpg", 0), dest;
vector<Mat> planes;
split(image1, planes);
planes[2]+=image2;
merge(planes, dest);

bubuko.com,布布扣

绘图:Point与Scalar

Point数据结构表示了由其图像坐标 bubuko.com,布布扣 和 bubuko.com,布布扣 指定的2D点。Scalar表示具有4个元素的数组,此类型在OpenCV中被大量用于传递像素值,如果用不到第四个参数,则无需定义。

OpenCV中左上角为(0,0),向右x增大,向下y增大。

1
2
3
4
5
6
7
8
9
// point 1
Point pt;
pt.x = 10;
pt.y = 8;
// point 2
Point pt =  Point(10, 8);
 
//Scalar
Scalar s = Scalar( a, b, c );

查看OpenCV中以下函数的定义:line, ellipse, circle, fillPoly, polylines, rectangle, putText

基本上用Point定位,再用Scalar选择颜色即可。

随机数生成器

1
2
3
4
5
RNG rng( 0xFFFFFFFF );  //初始化
Point pt1;
pt1.x = rng.uniform( x_1, x_2 );  //产生[x_1, y_1)范围的随机数
pt1.y = rng.uniform( y_1, y_2 );
int icolor = (unsigned) rng;

几种简单的表示方法

1
2
3
4
5
6
7
8
9
10
// c[i]= a[i]+b[i];
cv::add(imageA,imageB,resultC);
// c[i]= a[i]+k;
cv::add(imageA,cv::Scalar(k),resultC);
// c[i]= k1*a[1]+k2*b[i]+k3;
cv::addWeighted(imageA,k1,imageB,k2,k3,resultC);
// c[i]= k*a[1]+b[i];
cv::scaleAdd(imageA,k,imageB,resultC);
// if (mask[i]) c[i]= a[i]+b[i]; mask必须是1-channel
cv::add(imageA,imageB,resultC,mask);

cv::saturate_cast<uchar>(aNumber)  如果aNumber小于0或着大于255,返回0或者255;如果aNumber是浮点数,返回最接近的整数。

作用在两张图片上的方法:

cv::subtract, cv::absdiff, cv::multiply, cv::divide, cv::bitwise_and, cv::bitwise_or, cv::bitwise_xor, cv::bitwise_not, cv::min, cv::max

作用在一张图片上的方法:

cv::sqrt, cv::pow, cv::abs, cv::cuberoot, cv::exp, cv::log.

被重载的方法:

the bitwise operators &,|, ^, ~, the min, max, and absfunctions, the comparison operators <, <=, ==,!=, >, >=; these later returning a 8-bit binary image. You will also find the matrix multiplication m1*m2(where m1and m2are both cv::Matinstances), matrix inversion m1.inv(), transpose m1.t(), determinant m1.determinant(), vector norm, v1.norm(), cross-product v1.cross(v2), dot product v1.dot(v2), and so on.

OpenCV学习笔记(四) 图像操作,布布扣,bubuko.com

OpenCV学习笔记(四) 图像操作

原文:http://www.cnblogs.com/ericxing/p/3576801.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!