1,函数 cv2.add() 用于图像的加法运算。
函数说明:
cv2.add(src1, src2, dst, mask, dtype) → dst
函数 cv2.add() 对两张相同大小和类型的图像进行加法运算,或对一张图像与一个标量进行加法运算。
两张图像相加时,将两张图像相同位置像素的各通道值或灰度值分别相加,可以理解为一种图像叠加方式;对一张图像与一个标量相加时,则将图像所有像素的各通道值分别与标量的各通道值相加。
参数说明:
scr1, scr2:进行加法运算的图像
dst:输出的图像,可选项,默认值为 None
mask:掩模图像,8位灰度格式;掩模图像数值为 0 的像素,输出图像对应像素的各通道值也为 0。可选项,默认值为 None
dtype:图像数组的深度,即每个像素值的位数,可选项
注意事项:
OpenCV 加法:cv2.add() 是饱和运算(相加后如大于 255 则结果为 255)。
使用 cv2.add() 函数对两张图片相加时,图片的大小和类型(通道数)必须相同。
使用 cv2.add() 函数对一张图像与一个标量相加,标量是指一个 1×3 的 numpy 数组,相加后图像整体发白。
代码示例:
Mat dst1, dst2, dst3, dst4;
add(src1, src2, dst1);
imshow("add-Demo", dst1);
2,函数 cv2.addWeight() 用于图像的加权加法运算。
函数说明:
cv2.addWeighted(src1, alpha, src2, beta, gamma, dst, dtype) → dst
函数 cv2.addWeighted() 对两张相同大小和类型的图像按权重相加,可以实现图像的叠加和混合。加权加法的计算表达式为:
dst = src1 * alpha + src2 * beta + gamma
参数说明:
scr1, scr2:ndarray 多维数组,表示一个灰度或彩色图像
alpha:第一张图像 scr1 的权重,通常取为 0~1 之间的浮点数
beta:第二张图像 scr2 的权重,通常取为 0~1 之间的浮点数
gamma: 灰度系数,图像校正的偏移量,用于调节亮度
dtype 输出图像的深度,即每个像素值的位数,可选项,默认等于 src1.depth()
返回值:dst,加权加法运算结果的图像数组
注意事项:
使用 cv2.addWeight() 函数对两张图片相加时,图片的大小和类型(通道数)必须相同。
alpha,beta,gamma 可调,可以根据需要调整图像的权重,以达到不同的显示效果。推荐取 beta=1-alpha, gamma=0。
该接口可以实现图像亮度和对比度调整
PS: 黑色(0,0,0),白色(255,255,255),对RGB图像来说,亮度越大值越高,因此,通过增加像素值就可以提高亮度,反之减小亮度,而对比度体现的是图像的差异度,需要让图片的像素乘以某个值,增大差异就增大了对比度。
代码示例:
//打开原始图片
Mat src3 = imread("F:/code/images/kobe.jpg",IMREAD_COLOR);
if (src3.empty()) {
cout << "fail to read image" << endl;
return -1;
}
imshow("input3", src3);
//创建与原始图一样大小和类型的空像素图
Mat black = Mat::zeros(Size(src3.size()), src3.type());
//imshow("black", black);
black = Scalar(127,127,127);
//对原始图进行像素操作
Mat dst;
add(src3, black, dst);//给图片加亮
subtract(src3, black,dst);//给图片减亮
//imshow("dst", dst);
Mat dst2;
addWeighted(src3,1.5,black,0.5,0.0,dst2);//增加对比度
addWeighted(src3, 1.5, black, -0.5, 0.0, dst2);
addWeighted(src3, 0.5, black, 0.5, 0.0, dst2);//伪装一下透明度:原始图像素乘以0.5
imshow("dst2", dst2);
3,像素信息统计
像素最大值与最小值:minMaxLoc ,此API只支持单通道的图像
求得单通道图像中,像素的最大值和最小值,以及他们分别的像素点位置坐标
double min_val;
double max_val;
Point min_loc;
Point max_loc;
minMaxLoc(img, &min_val, &max_val, &min_loc, &max_loc);//注意,这个 img 要是单通道
printf("min:%.2f,max:%.2f\n", min_val, max_val);
printf("minloc:(%d,%d),maxloc:(%d,%d)\n", min_loc.x, min_loc.y,max_loc.x,max_loc.y);
像素均值和方差:mean meanStdDev
Scalar s = mean(img);//获取三通道图像的均值
printf("mean:%.2f,%.2f.%.2f\n", s[0],s[1],s[2]);
Mat mm, mstd;
meanStdDev(img, mm, mstd);//save 3 channels mean and stddev
printf("mm:%.2f,%.2f,%.2f mstd:%.2f,%.2f,%.2f\n", mm.at<double>(0, 0),mm.at<double>(1, 0), mm.at<double>(2, 0),
mstd.at<double>(0, 0), mstd.at<double>(1, 0), mstd.at<double>(2, 0));
像素值信息统计:通过遍历像素值做统计
定义一个整型的 vector , 大小为256,因为像素值的大小是:0-255;然后通过遍历图像的像素值,在对应的vector位置上自加,实现统计,后续可以将统计结果通过直方图显示。
//统计灰度图像
vector<int> hist(256);
for (int i = 0; i < 256; i++) {
hist[i] = 0;
}
for (int row = 0; row < height; row++) {
for (int col = 0; col < width; col++) {
int pv = img.at<uchar>(row, col);
hist[pv]++;//统计不同像素点的数量,做直方图统计
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/182023.html