OpenCV基础 | 1.像素运算

时间:2023-02-15 15:13:03

✅作者简介:热爱科研的算法开发者,Python、Matlab项目可交流、沟通、学习。

????个人主页:算法工程师的学习日志

图像像素运算

  • 算术运算
  • 加,减,乘,除
  • 应用:调节亮度,调整对比度
  • 逻辑运算
  • 与,或,非

  • 应用:遮罩层控制

  • 改变对比度,亮度


图片读入程序中后,是以numpy数组存在的。因此对numpy数组的一切功能,对图片也适用。对数组元素的访问,实际上就是对图片像素点的访问。

彩色图片访问方式为:img[i,j,c]

i表示图片的行数,j表示图片的列数,c表示图片的通道数(RGB三通道分别对应0,1,2)。坐标是从左上角开始。

灰度图片访问方式为:gray[i,j]

1.算术运算

两张形状大小完全相同的图进行加减乘除,如果图像大小不一致,会报错,可以通过cv2.resize函数裁剪图片到同一个尺寸,原图如下

OpenCV基础 | 1.像素运算

OpenCV基础 | 1.像素运算

  • 两张图片的各个像素点的通道值相加
  • 黑为0,白为255,像素值相加后得到新的像素值,如果像素值结果超过255,进行截断,最终结果还是255,即为白色
import cv2


p = cv2.imread('./python1.jpg')
m = cv2.imread('./matlab.jpg')


dst = cv2.add(p, m)
cv2.imshow("add_demo", dst)
cv2.waitKey(0)
  • 应用:去除叠加性噪声 ,生成图像叠加效果

OpenCV基础 | 1.像素运算

  • 两张图片各个像素点的通道值相减
  • 黑为0,白为255,如果相减后像素值为负值,而范围是0-255,因此取0,即为黑;
import cv2


p = cv2.imread('./python1.jpg')
m = cv2.imread('./matlab.jpg')


dst = cv2.subtract(p, m)
cv2.imshow("add_demo", dst)
cv2.waitKey(0)
  • OpenCV基础 | 1.像素运算

  • 应用:显示两幅图像的差异,检测同一场景 两幅图像之间的变化;图像分割,如分割运动的车辆,减法去掉静止的部分,剩余的是运动元素和噪声。

  • 两张图片各个像素点的通道值相乘



  • 黑为0,0*图二中任意的一个像素值为0,为黑,因为python图都是白色居多,弄个求反图片变黑,python图外边框是反锯齿的(边缘柔化),有模糊的,并不一定都为0,因此相乘之后会出现那种像烟花的边边



  • import cv2


    p = cv2.imread('./python1.jpg')
    m = cv2.imread('./matlab.jpg')


    dst = cv2.multiply(255-p, m)
    cv2.imshow("demo", dst)
    cv2.waitKey(0)


  • OpenCV基础 | 1.像素运算


  • 应用:图像的局部显示,用二值模板图像与原图像做乘法





  • 两张图片各个像素点的通道值相除



  • 应用少



  • import cv2


    p = cv2.imread('./python1.jpg')
    m = cv2.imread('./matlab.jpg')


    dst = cv2.divide(p, 255-m)
    cv2.imshow("demo", dst)
    cv2.waitKey(0)


  • OpenCV基础 | 1.像素运算

2.逻辑运算

  • 全1得1
import cv2


p = cv2.imread('./python1.jpg')
m = cv2.imread('./matlab.jpg')


dst = cv2.bitwise_and(p, m)
cv2.imshow("demo", dst)
cv2.waitKey(0)
  • OpenCV基础 | 1.像素运算

  • 相当于一个mask
  • 应用:求两个子图的相交子图

  • 有1得1



  • import cv2


    p = cv2.imread('./python1.jpg')
    m = cv2.imread('./matlab.jpg')


    dst = cv2.bitwise_or(p, m)
    cv2.imshow("demo", dst)
    cv2.waitKey(0)


  • OpenCV基础 | 1.像素运算


  • 应用:合并图片





  • 0得1,1得0 ,针对的是一张图,等效于255-p



  • import cv2


    p = cv2.imread('./python1.jpg')
    m = cv2.imread('./matlab.jpg')


    dst = cv2.bitwise_not(p)
    cv2.imshow("demo", dst)
    cv2.waitKey(0)


  • OpenCV基础 | 1.像素运算


  • 应用:获得图片的补图


3.改变对比度,亮度

def contrast_brightness_demo(image, c, b):
h, w, ch = image.shape
#初始化一张黑图
blank = np.zeros([h, w, ch], image.dtype)

# 图像混合,c, 1-c为这两张图片的权重
dst = cv.addWeighted(image, c, blank, 1-c, b)
cv.imshow("contrast_brightness_demo", dst)

src=cv.imread("./images/lena.jpg")
#对比度1.2,亮度100
contrast_brightness_demo(src,1.2,100)

结果如下:

OpenCV基础 | 1.像素运算

OpenCV基础 | 1.像素运算