06_OpenCV常用像素操作API

06_OpenCV常用像素操作API

    • 1. 图像像素的算术操作
      • 1.1 常用的像素的算数操作介绍
      • 1.2 C++代码实践
      • 1.3 Python代码实践
      • 1.4 操作结果
    • 2.图像像素的逻辑操作
      • 2.1 图像像素的逻辑操作介绍
      • 2.2 代码实践
      • 2.3 操作结果

1. 图像像素的算术操作

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

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

  • add
  • subtract
  • multiply
  • divide

饱和运算的概念:因为像素值得范围一般是0~255,因此像素值经过算术操作后大于等于255的时候应该取255,小于等于0的时候取0。在C++中通过saturate_cast(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
Mat1 Mat2 异或
0 0 0 0 0
1 0 0 1 1
0 1 0 1 1
1 1 1 1 0

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

你可能感兴趣的:(数字图像处理与OpenCV)