4. 像素运算

1. 加减乘除

def add_function(image1, image2):
    """
    像素相加:
        其中白色就是255,再加也是白色; 黑色是 0,
    """
    image = cv.add(image1, image2)
    cv.imshow("add", image)


def subtract_function(image1, image2):
    """
    像素相减:
        白色可以减去任何颜色;
        但是黑色减其他颜色为负数,根据无符号数uint8,负数都看做0
    """
    image = cv.subtract(image1, image2)
    cv.imshow("subtract", image)


def multiply_function(image1, image2):
    """
    像素相乘:
        根据像素模糊,白色区域附近不是平滑的,所以白色附近像素有花;
    """
    image = cv.multiply(image1, image2)
    cv.imshow("multiply", image)


def other(image):
    """
        图像均值,均值越高,证明色彩越多; 均值越小,说明色彩越暗
        方差:方差越小,色差越小,如果黑白图片的方差就很高了。方差越大,像素差异就越大,对比度大
    """
    image_mean, image_staddev = cv.meanStdDev(image)  #返回一个均值和方差
    print("均值:\n %s" % image_mean)
    print("方差:\n %s" % image_staddev)

### 还有一个直接获取均值的API   img_mean = cv.mean(src)  
查看各个通道的均值能 了解那个是主色调

 应用: 调节亮度,调整对比度

def contrast_brightness_demo(image, c, b):
    h, w, ch = image.shape
    blank = np.zeros([h,w,ch], image.dtype)
    dst = cv.addWeighted(image, c, blank, 1-c, b)  # 按比例融合,image 的 c 比例,而 blank 的 1-c 比例
    cv.imshow("con-bri-demo", dst)

contrast对比度, brightness是亮度
contrast_brightness_demo(src1, 1.2, 10)

2.逻辑运算,即按位与,或,非

img_and = cv.bitwise_and(img1, img2) #做一些遮罩

img_or = cv.bitwise_or(img1, img2) # 把两张图图片相加

img_xor = cv.bitwise_xor(img1, img2)

img_not = cv.bitwise_not(img1)   # 安位取反

黑白图像,一般用作mask, 也叫二值图像

import cv2 as cv import numpy as np def add_demo(m1,m2): dst = cv.add(m1,m2) cv.imshow("add_demo",dst) #xiangjian def subtract_demo(m1,m2): dst = cv.subtract(m1,m2) cv.imshow("sub_demo",dst) #chu def divide_demo(m1,m2): dst = cv.divide(m1,m2) cv.imshow("divide_demo", dst) #cheng def multiply(m1,m2): dst = cv.multiply(m1,m2) cv.imshow("multiply_demo",dst) def others(m1,m2): #cv.mean():得到一个关于每个通道图像的像素值的均值的数组。 M1 = cv.mean(m1) M2 = cv.mean(m2) print(M1) print(M2) src2 = cv.imread("E:/opencv/picture/WindowsLogo.jpg") src1 = cv.imread("E:/opencv/picture/LinuxLogo.jpg") print("src1 =%s ,src2 =%s"%(src1.shape,src2.shape)) add_demo(src1,src2) subtract_demo(src1,src2) divide_demo(src1,src2) multiply(src1,src2) others(src1,src2) cv.imshow("img1",src1) cv.imshow("img2",src2) cv.waitKey(0) cv.destroyAllWindows() 总结: 进行图像运算的前提是两个图片的尺寸和维度是完全一样的。 相关的api指令: 1. 相加 dst = cv.add(m1,m2) 2. 相减 dst = cv.subtract(m1,m2) 3. 相乘 dst = cv.multiply(m1,m2) 4. 相除 dst = cv.divide(m1,m2) 5. 求出图片各个通道像素值的平均值 M1 = cv.mean(m1) print(M1) 6. 求出图片的均值与方差, MM1,dev1 = cv.meanStdDev(m1) MM2,dev2 = cv.meanStdDev(m2) 其中返回值MM1是各个通道像素的均值,dev1是各个通道像素方差。 注意: 1-4 输出的依旧是图片数组。 5-6 输出的是1行3列1维的数组(分别是各个通道像素值的均值与方差)。 下面再分析逻辑运算与对比度,亮度调整: def logic_demo(m1,m2): dst1 = cv.bitwise_and(m1,m2) dst2 = cv.bitwise_or(m1,m2) dst3 = cv.bitwise_not(m1)#这个一般只针对一个对象 cv.imshow("logic_win1",dst1) cv.imshow("logic_win2", dst2) cv.imshow("logic_win3", dst3) 相关api指令: 1. cv.bitwise_and(src1,src2) 将src1,src2两图像作“逻辑并”运算 2. cv.bitwise_or(src1,src2) 将src1,src2两图像作“逻辑或”运算 3. cv.bitwise_not(src) 将src图像作非运算 亮度,对比度调节: def contrast_brightness_demo(image,c,b): h,w,ch = image.shape blank = np.zeros([h,w,ch],image.dtype) dst = cv.addWeighted(image,c,blank,1-c,b) cv.imshow("dst_contrast_win",dst) 其中api指令:addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype=-1); 一共有七个参数:前4个是两张要合成的图片及它们所占比例,第5个double gamma起微调作用,后面两个不管。 由公式得出两个图片加成输出的图片为:dst=src1*alpha+src2*beta+gamma 在程序段中: dst = image*c +0*(1-c)+gamma 所以说1-c这项写啥都行,0也就ok了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值