opencv-python像素运算

像素运算(两个图形必须完全一致):算数运算,逻辑运算

1·通过加减乘除,调节图像的亮度,对比度

2·通过与,或,非,实现遮罩层的控制

整体实现常见的图像混合,算数运算与几何运算

只有黑白二色的图像,我们称之为mask

'''——————————————算数运算————————————————'''
def add_demo(m1,m2): #加
    dst = cv.add(m1,m2)
    cv.imshow("add_image",dst)

def sub_demo(m1,m2): #减
    dst = cv.subtract(m1,m2)
    cv.imshow("sub_image",dst)

def div_demo(m1,m2): #乘
    dst = cv.divide(m1,m2)
    cv.imshow("div_image",dst)

def mul_demo(m1,m2): #除
    dst = cv.multiply(m1,m2)
    cv.imshow("mul_image",dst)

效果图:

'''——————————————像素统计————————————————'''
def average(img1, img2):
    """展示BGR三个通道各自的平均值"""
    """可以用来统计整幅图像中,BGR中哪种颜色所占比例最大,哪种又是最小"""
    mean1 = cv.mean(img1)
    mean2 = cv.mean(img2)
    print(mean1)
    print(mean2)


def mean_dev(img1, img2):
    """方法cv.meanStdDev()不仅可以求出各通道均值,还能求出各通道标准差"""
    """标准差越大说明各个像素之间差异越大"""
    """标准差可以用来判断一张图像是否含有有效信息,标准差过小肯定有问题(纯色图标准差为0)"""
    mean1, dev1 = cv.meanStdDev(img1)
    mean2, dev2 = cv.meanStdDev(img2)
    print(mean1)
    print(mean2)
    print(dev1)
    print(dev2)
    h,w = img1.shape[:2]
    img = np.zeros([h,w],np.uint8)
    m,dev = cv.meanStdDev(img)
    print(m)
    print(dev)

效果图:

'''——————————————逻辑运算————————————————'''
def logic_and_demo(img1, img2):
    """逻辑与运算,只有两个bit都是1时,两bit的与运算结果才为1"""
    """黑色BGR(0,0,0)数据类型为uint8,所以二进制形态为00000000"""
    """白色BGR(255,255,255)数据类型为uint8,二进制形态为11111111"""
    """由此可见黑色像素与任何颜色进行与运算结果都为黑色,黑色遮挡一切"""
    """白色像素和任何颜色像素进行与运算结果都为原来的颜色,白色相当于透明"""
    dst = cv.bitwise_and(img1, img2)
    # 注意,若img1或img2中有一个是mask,则它可以作为遮罩层
    cv.imshow("logic_and_dst", dst)


def logic_or_demo(img1, img2):
    """两bit进行或运算,两bit中只要与一个为1,则结果为1"""
    """任何颜色与黑色进行或运算,结果都保持原来的颜色"""
    """任何颜色与白色进行或运算,结果都为白色"""
    dst = cv.bitwise_or(img1, img2)
    cv.imshow("logic_or_dst", dst)


def logic_not_demo(img1):
    """bit_wise_not其实是按位取反,即像素的某个通道二进制形态为10010011,则变为01101100"""
    """注意01101100+10010011=11111111,即255"""
    dst = cv.bitwise_not(img1)
    cv.imshow("logic_not_dst", dst)

效果图:

'''——————————————对比度和亮度————————————————'''
def contract_brightness_demo(image,c,b):
    """利用图像的加权叠加来实现对比度的调整,以及亮度的调整,c代表对比度,b代表亮度"""
    h, w, ch = image.shape  # 求出img的高和宽和通道数
    blank = np.zeros([h, w, ch], dtype=np.uint8)  # 生成一张纯黑色图像
    dst = cv.addWeighted(image, c, blank, 1 - c, b)
    # cv2.addWeighted()方法表示将img和blank两张图,按照c和1-c的比例加权叠加
     # 由于blank是一张纯黑色的图,所有像素都是0,所以等价于将img的所有像素值乘上c(c>1也可以)
     # 乘上c之后,2变4,4变8,不同像素之间的差异也就变大了,及对比度提高
     # b表示每个像素的每个通道的值加上b,也就是亮度提高
    cv.imshow("cb_dst", dst)

效果图:

完整代码:

扫描二维码关注公众号,回复: 8930326 查看本文章
import cv2 as cv
import numpy as np
'''——————————————算数运算————————————————'''
def add_demo(m1,m2): #加
    dst = cv.add(m1,m2)
    cv.imshow("add_image",dst)

def sub_demo(m1,m2): #减
    dst = cv.subtract(m1,m2)
    cv.imshow("sub_image",dst)

def div_demo(m1,m2): #乘
    dst = cv.divide(m1,m2)
    cv.imshow("div_image",dst)

def mul_demo(m1,m2): #除
    dst = cv.multiply(m1,m2)
    cv.imshow("mul_image",dst)

'''——————————————像素统计————————————————'''
def average(img1, img2):
    """展示BGR三个通道各自的平均值"""
    """可以用来统计整幅图像中,BGR中哪种颜色所占比例最大,哪种又是最小"""
    mean1 = cv.mean(img1)
    mean2 = cv.mean(img2)
    print(mean1)
    print(mean2)


def mean_dev(img1, img2):
    """方法cv.meanStdDev()不仅可以求出各通道均值,还能求出各通道标准差"""
    """标准差越大说明各个像素之间差异越大"""
    """标准差可以用来判断一张图像是否含有有效信息,标准差过小肯定有问题(纯色图标准差为0)"""
    mean1, dev1 = cv.meanStdDev(img1)
    mean2, dev2 = cv.meanStdDev(img2)
    print(mean1)
    print(mean2)
    print(dev1)
    print(dev2)
    h,w = img1.shape[:2]
    img = np.zeros([h,w],np.uint8)
    m,dev = cv.meanStdDev(img)
    print(m)
    print(dev)

'''——————————————逻辑运算————————————————'''
def logic_and_demo(img1, img2):
    """逻辑与运算,只有两个bit都是1时,两bit的与运算结果才为1"""
    """黑色BGR(0,0,0)数据类型为uint8,所以二进制形态为00000000"""
    """白色BGR(255,255,255)数据类型为uint8,二进制形态为11111111"""
    """由此可见黑色像素与任何颜色进行与运算结果都为黑色,黑色遮挡一切"""
    """白色像素和任何颜色像素进行与运算结果都为原来的颜色,白色相当于透明"""
    dst = cv.bitwise_and(img1, img2)
    # 注意,若img1或img2中有一个是mask,则它可以作为遮罩层
    cv.imshow("logic_and_dst", dst)


def logic_or_demo(img1, img2):
    """两bit进行或运算,两bit中只要与一个为1,则结果为1"""
    """任何颜色与黑色进行或运算,结果都保持原来的颜色"""
    """任何颜色与白色进行或运算,结果都为白色"""
    dst = cv.bitwise_or(img1, img2)
    cv.imshow("logic_or_dst", dst)


def logic_not_demo(img1):
    """bit_wise_not其实是按位取反,即像素的某个通道二进制形态为10010011,则变为01101100"""
    """注意01101100+10010011=11111111,即255"""
    dst = cv.bitwise_not(img1)
    cv.imshow("logic_not_dst", dst)



src1 = cv.imread("C:/Users/idmin/Desktop/img/img3.jpg")
src2 = cv.imread("C:/Users/idmin/Desktop/img/img4.jpg")
print(src1.shape)
print(src2.shape)
cv.namedWindow("input image1", cv.WINDOW_AUTOSIZE)
cv.namedWindow("input image2", cv.WINDOW_AUTOSIZE)
cv.imshow("input image1", src1)
cv.imshow("input image2", src2)
add_demo(src1,src2)
sub_demo(src1,src2)
div_demo(src1,src2)
mul_demo(src1,src2)
logic_and_demo(src1,src2)
logic_or_demo(src1,src2)
logic_not_demo(src1)
average(src1,src2)
mean_dev(src1,src2)
contract_brightness_demo(src1,1.5,20)
cv.waitKey(0)
cv.destroyAllWindows()
发布了42 篇原创文章 · 获赞 13 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_39395805/article/details/100009657