从头学习opencv(4)--像素运算

本文深入探讨了图像处理中的核心算法,包括算术运算、逻辑运算、对比度和亮度调整等,通过具体代码实例展示了如何使用OpenCV进行图像运算,同时解析了不同运算对图像效果的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

算术运算–加减乘除

#算数运算(加、减、乘、除)、均值、均方差
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 multiply_demo(m1,m2):
    dst=cv.multiply(m1,m2)
    cv.imshow("multiply_demo",dst)


def divide_demo(m1,m2):
    dst=cv.divide(m1,m2)
    cv.imshow("divide_demo",dst)

均值、均方差

def others(m1,m2):
    #标准差越大说明色差越大
    M1,dev1=cv.meanStdDev(m1)
    M2 ,dev2= cv.meanStdDev(m2)
    #均值
    print(M1)
    print(M2)
    #方差
    print(dev1)
    print(dev2)

    #测试
    #当图像的数值全是同一个数时,均值和均方差相同,说明图片没有加载有用信息
    h,w=m1.shape[:2]
    img=np.zeros([h,w],np.uint8)
    m,dev=cv.meanStdDev(img)
    print(m)
    print(dev)

逻辑运算–与或非

#逻辑运算--与或非
def logic_demo(m1,m2):
    dst=cv.bitwise_and(m1,m2)
    cv.imshow("and",dst)
    dst=cv.bitwise_or(m1,m2)
    cv.imshow("or", dst)
    dst=cv.bitwise_not(m1)
    cv.imshow("not m1", dst)
    dst=cv.bitwise_not(m2)
    cv.imshow("not m2", dst)

提高对比度、亮度

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("con_bri_demo",dst)

总代码

import cv2 as cv
import numpy as np


#算数运算(加、减、乘、除)、均值、均方差
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 multiply_demo(m1,m2):
    dst=cv.multiply(m1,m2)
    cv.imshow("multiply_demo",dst)


def divide_demo(m1,m2):
    dst=cv.divide(m1,m2)
    cv.imshow("divide_demo",dst)


def others(m1,m2):
    #标准差越大说明色差越大
    M1,dev1=cv.meanStdDev(m1)
    M2 ,dev2= cv.meanStdDev(m2)
    #均值
    print(M1)
    print(M2)
    #方差
    print(dev1)
    print(dev2)

    #测试
    #当图像的数值全是同一个数时,均值和均方差相同,说明图片没有加载有用信息
    h,w=m1.shape[:2]
    img=np.zeros([h,w],np.uint8)
    m,dev=cv.meanStdDev(img)
    print(m)
    print(dev)


#逻辑运算--与或非
def logic_demo(m1,m2):
    dst=cv.bitwise_and(m1,m2)
    cv.imshow("and",dst)
    dst=cv.bitwise_or(m1,m2)
    cv.imshow("or", dst)
    dst=cv.bitwise_not(m1)
    cv.imshow("not m1", dst)
    dst=cv.bitwise_not(m2)
    cv.imshow("not m2", dst)


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("con_bri_demo",dst)


src = cv.imread("C:/Users/Administrator/Desktop/demo.png")
src1=cv.imread("D:/OpenCV/opencv/sources/samples/data/LinuxLogo.jpg")
src2=cv.imread("D:/OpenCV/opencv/sources/samples/data/WindowsLogo.jpg")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
add_demo(src1,src2)
subtract_demo(src1,src2)
multiply_demo(src1,src2)
divide_demo(src1,src2)
others(src1,src2)
logic_demo(src1,src2)
cv.imshow("input image", src2)
contrast_brightness_demo(src2,1.5,50)
cv.waitKey(0)
cv.destroyAllWindows()
print("Hi,python!")

备注

1.两个图片相乘之后的图片如下:
在这里插入图片描述
为什么周围会有锯齿,是因为把两个图片放大会发现,边缘并不是光滑的,当相乘的时候是有数字的,所以相乘以后不是光滑的

2.提高对比度和亮度是怎样实现的
首先介绍一下这个函数:
void cvAddWeighted( const CvArr* src1, double alpha,const CvArr* src2, double beta,double gamma, CvArr* dst );
参数1:src1,第一个原数组.
参数2:alpha,第一个数组元素权重
参数3:src2第二个原数组
参数4:beta,第二个数组元素权重
参数5:gamma,图1与图2作和后添加的数值。不要太大,不然图片一片白。总和等于255以上就是纯白色了。
参数6:dst,输出图片
最后的数值=src1* alpha+src2* beat+gamma

在本例中,contrast_brightness_demo(src2,1.5,50)
带入代码中,函数就变成了
dst=cv.addWeighted(src2,1.5,blank,1-1.5,50)
而在这之前,blank是一个全零的矩阵,所以不管乘多少都是0,就变成了src2* 1.5+50
在原来的数值上乘1.5,数值之间的差距越来越大,所以对比也就越来越大,而亮度则是线性相加。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值