Python+OpenCV图像处理(五)—— 像素运算
最近在忙毕业设计,只能偶尔更新博客........
一、像素的算术运算
像素的算术运算涉及加减乘除等基本运算(要进行算术运算,两张图片的形状(shape)必须一样)
代码如下:
#像素的算术运算(加、减、乘、除) 两张图片必须shape一致 import cv2 as cv def add_demo(m1, m2): #像素的加运算 dst = cv.add(m1, m2) cv.imshow("add_demo", dst) def subtract_demo(m1, m2): #像素的减运算 dst = cv.subtract(m1, m2) cv.imshow("subtract_demo", dst) def divide_demo(m1, m2): #像素的除法运算 dst = cv.divide(m1, m2) cv.imshow("divide_demo", dst) def multiply_demo(m1, m2): #像素的乘法运算 dst = cv.multiply(m1, m2) cv.imshow("multiply_demo", dst) src1 = cv.imread('E:\imageload\LinuxLogo.jpg') src2 = cv.imread('E:\imageload\WindowsLogo.jpg') cv.imshow('image1', src1) cv.imshow('image2', src2) add_demo(src1, src2) subtract_demo(src1, src2) divide_demo(src1, src1) multiply_demo(src1, src2) cv.waitKey(0) cv.destroyAllWindows()
运行结果:
注意:
1.这里的的像素运算指的是多维数组对应的值进行加减乘除运算,前提是两张图片必须shape、size一样
2.在相除的时候,一个很小的数除以很大的数结果必然小,所以得出的图像几乎全黑。(黑色为0,白色为255)
3.在相乘的时候,图案“Linux”边缘上的像素并不稳定
二、像素的逻辑运算
像素的逻辑运算涉及与、或、非、异或等基本运算(要进行逻辑运算,两张图片的形状(shape)必须一样)
这里主要展示与或非的逻辑运算
代码如下:
#像素的逻辑运算(与、或、非) 两张图片必须shape一致 import cv2 as cv def and_demo(m1, m2): #与运算 每个像素点每个通道的值按位与 dst = cv.bitwise_and(m1, m2) cv.imshow("and_demo", dst) def or_demo(m1, m2): #或运算 每个像素点每个通道的值按位或 dst = cv.bitwise_or(m1, m2) cv.imshow("or_demo", dst) def not_demo(m1): #非运算 每个像素点每个通道的值按位取反 dst = cv.bitwise_not(m1) cv.imshow("not_demo", dst) src1 = cv.imread('E:\imageload\LinuxLogo.jpg') src2 = cv.imread('E:\imageload\WindowsLogo.jpg') cv.imshow('image1', src1) cv.imshow('image2', src2) and_demo(src1, src2) or_demo(src1, src2) not_demo(src1) cv.waitKey(0) cv.destroyAllWindows()
运行结果:
注意:这里的逻辑运算是按照像素点的各通道的值按二进制形式按位与或非进行运算的
三、调节图片对比度和亮度
代码如下:
#调节图片对比度和亮度 import cv2 as cv import numpy as np def contrast_brightness_image(img1, ratio, b): #第2个参数rario为对比度 第3个参数b为亮度 h, w, ch = img1.shape img2 = np.zeros([h, w, ch], img1.dtype) # 新建的一张全黑图片和img1图片shape类型一样,元素类型也一样 dst = cv.addWeighted(img1, ratio, img2, 1 - ratio, b) cv.imshow("csecond", dst) src = cv.imread("E:\imageload\example.png") cv.imshow("first", src) contrast_brightness_image(src, 0.1, 10) cv.waitKey(0) cv.destroyAllWindows()
运行结果:
注意:help(cv2.addWeighted)可得到.addWeighted函数的官方解释。
函数addWeighted的原型:addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]]) -> dst
src1表示需要加权的第一个数组(上述例子就是图像矩阵)
alpha表示第一个数组的权重
src2表示第二个数组(和第一个数组必须大小类型相同)
beta表示第二个数组的权重
gamma表示一个加到权重总和上的标量值
即输出后的图片矩阵:dst = src1*alpha + src2*beta + gamma;