OpenCV之像素点的运算

举报
Y_K_C 发表于 2021/11/29 00:37:33 2021/11/29
【摘要】 声明:本文是OpenCV入门级别的技术分享,主要围绕图像预处理来进行学习,所用语言均为Python。

1. 图像像素值的四则运算

OpenCV中的图像对象本质上是numpy的ndarray对象,因此对图像像素点的四则运算均是对ndarray中的元素进行四则计算,OpenCV提供相应的API,具体如下:

import cv2 as cv
import numpy as np
path = "C:\\Users\\27914\\Desktop\\images\\test2.jpg"
image = cv.imread(path)
blank = np.zeros_like(image)
h,w,c = blank.shape
for row in range(h):
    for col in range(w):
        blank[row,col] = (2,2,2)
add = cv.add(image,blank)#提高亮度(纯像素)
sub = cv.subtract(image,blank)#降低亮度(纯像素)
mul = cv.multiply(image,blank)#提高对比度(纯像素)
div = cv.divide(image,blank)#降低对比度(纯像素)
cv.imshow("image",image)
cv.imshow("add",add)
cv.imshow("sub",sub)
cv.imshow("mul",mul)
cv.imshow("div",div)
cv.waitKey(0)
cv.destroyAllWindows()

本例是将一张图片与一张与其大小相同的纯像素(像素值均为2)的图像进行计算。
原图:
image.png
加法:
image.png
减法:
image.png
乘法:
image.png
除法:
image.png
加法操作是将图片的亮度提高,减法则是将亮度降低,乘法操作是在提高亮度的同时提高了对比度,除法降低了对比度,也降低了亮度。需要注意的是在进行四则运算时两个对象中其一要为纯像素图像,两个非纯像素图像进行四则运算是无意义的,同时还应注意两个图像的宽高通道数均需要一致,像素点类型也要保持相同,在BGR色彩空间中,像素值在0~255之间,对应numpy的uint8类型,必要时需要进行转换。

2. 图像像素值的统计

图像的像素统计一般是计算图像各通道像数值的最大值,最小值,均值和标准差,具体如下:

import cv2 as cv
import numpy as np
path = "C:\\Users\\27914\\Desktop\\images\\test1.jpeg"
image = cv.imread(path)
max = np.max(image[:,:,0])
min = np.min(image[:,:,0])
mean,std = cv.meanStdDev(image)
print("max:%d min:%d\n "%(max,min),"mean:\n",mean,"\nstd:\n",std)

计算各通道的最大值最小值直接使用numpy的API,均值和标准差则是用的OpenCV的API。
浅谈各个数据的作用:
各通道的最大值最小值一般分别为255和0,反映图像各个通道的最大亮度和最小亮度
均值则是反映各个通道整体的明暗程度,均值小说明图像整体偏暗,均值大说明图像整体偏亮
标准差反映的是各个通道中像素值分布的散乱情况,标准差大说明像素值变化较大,包含的信息就越多,标准差越小说明像素值变化较小,包含的信息较少,当它为0时,该图片为空白图片,基本不包含信息。

3. 图像的逻辑运算

图像的逻辑运算是将参与计算的图像对应位置像素值按照与或非的规则进行逻辑运算得到新的图,具体如下:

import cv2 as cv
import numpy as np
image1 = np.zeros((500,500,3),dtype=np.uint8)
image1[:,:] = (0,255,0)
image2 = np.zeros((500,500,3),dtype=np.uint8)
image2[:,:] = (255,0,255)
and_ = cv.bitwise_and(image1,image2)
not_image1 = cv.bitwise_not(image1)
or_ = cv.bitwise_or(image1,image2)
xor_ =  cv.bitwise_xor(image1,image2)
cv.imshow("image1",image1)
cv.imshow("image2",image2)
cv.imshow("and",and_)
cv.imshow("not_image1",not_image1)
cv.imshow("or",or_)
cv.imshow("xor",xor_)
cv.waitKey(0)
cv.destroyAllWindows()

本例用到的都是纯像素图像,原始的两张图为:
image.png
image.png
与操作:
image.png
同或操作:
image.png
异或操作:
image.png
非操作:
image.png
作用:逻辑操作能够与二值化操作配合,将原图中的某一部分保留而其他部分替换成空白,降低噪声(背景较为简单的情况下)。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。