数字图像基本OP:OpenCV图像像素的算术运算和逻辑运算

本文详细介绍OpenCV中图像像素的算术运算和逻辑运算,包括矩阵元素的加、减、乘、除、绝对值等算术操作,以及与、或、异或、取反等逻辑操作。提供了C++和Python代码实践,演示如何处理图像并展示操作结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

图像的运算是两个图像对应位置的像素的操作,因此要求两个图像具有相同的宽高和通道数。

1. 图像像素的算术操作

1.1 常用的像素的算数操作介绍

常用的像素的算数操作有:

  • 矩阵元素取绝对值abs
  • 两个矩阵逐元素加add
  • 两个矩阵逐元素减subtract
  • 两个矩阵逐元素乘multiply
  • 两个矩阵逐元素除divide

饱和运算的概念:因为像素值得范围一般是0~255,因此像素值经过算术操作后大于等于255的时候应该取255,小于等于0的时候取0。在C++中通过saturate_cast<uchar>(a+b)对可以对a+b的结果进行上述的溢出保护,Python中则通过cv.subtract方法。

1.2 C++代码实践

读入图片:

Mat input1 = imread("test_images/opencv.jpg", 1);
if (input1.empty())
{
	cout << "read input failed!" << endl;
	return -1;
}
Mat input2 = imread("test_images/cat.jpg", 1);
if (input2.empty())
{
	cout << "read input failed!" << endl;
	return -1;
}

因为算术操作是对两张图像的操作,所以需要读入两张图片。


进行相应的操作,需要定义出保存操作结果的Mat,当然也要保证两个图像的大小是一样的,这样才能保证对应位置上的像素值进行相应的操作:

//将两个图片resize到同样大小
resize(input1, input1, Size(400, 300));
resize(input2, input2, Size(400, 300));
imshow("input1", input1);
imshow("input2", input2);

//定义出保存操作结果的 Mat
Mat add_result = Mat::zeros(input1.size(), input1.type());
Mat sub_result = Mat::zeros(input1.size(), input1.type());
Mat mul_result = Mat::zeros(input1.size(), input1.type());
Mat div_result = Mat::zeros(input1.size(), input1.type());

add(input1, input2, add_result);
subtract(input1, input2, sub_result);
multiply(input1, input2, mul_result);
divide(input1, input2, div_result);

imshow("add_result", add_result);
imshow("sub_result", sub_result);
imshow("mul_result", mul_result);
imshow("div_result", div_result);

1.3 Python代码实践

src1 = cv.imread("test_images/opencv.jpg");
src2 = cv.imread("test_images/cat.jpg");
cv.imshow("input1", src1)
cv.imshow("input2", src2)
h, w, ch = src1.shape
print("h , w, ch", h, w, ch)

add_result = np.zeros(src1.shape, src1.dtype);
cv.add(src1, src2, add_result);
cv.imshow("add_result", add_result);

sub_result = np.zeros(src1.shape, src1.dtype);
cv.subtract(src1, src2, sub_result);
cv.imshow("sub_result", sub_result);

mul_result = np.zeros(src1.shape, src1.dtype);
cv.multiply(src1, src2, mul_result);
cv.imshow("mul_result", mul_result);

div_result = np.zeros(src1.shape, src1.dtype);
cv.divide(src1, src2, div_result);
cv.imshow("div_result", div_result);

cv.waitKey(0)
cv.destroyAllWindows()

1.4 操作结果

在这里插入图片描述

2.图像像素的逻辑操作

2.1 图像像素的逻辑操作介绍

逻辑操作是对于图像中像素点位的操作。

对两张图像的操作:

  • 两个矩阵逐元素与操作:bitwise_and
  • 两个矩阵逐元素异或操作:bitwise_xor
  • 两个矩阵逐元素或操作:bitwise_or

对单个图像的操作:

  • 取反操作:bitwise_not
Mat1Mat2异或
00000
10011
01011
11110

2.2 代码实践

C++

Mat and_, xor_, or_ , not_;
bitwise_and(input1, input2, and_);
bitwise_xor(input1, input2, xor_);
bitwise_or(input1, input2, or_ );
bitwise_not(input1, not_);

imshow("and", and_);
imshow("xor", xor_);
imshow("or", or_ );
imshow("not", not_);

2.3 操作结果

在这里插入图片描述

本部分完整代码:
image_common_pixels_op.cpp
image_common_pixels_op.py

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值