python3-opencv库(4)--图片像素运算,利用加权叠加调节图像对比度和亮度
2018-02-25 10:44
2526 查看
版权声明:转载请注明原作者及出处
本文所涉及的一切图像像素运算,前提都是两张图尺寸相同,通道数相同
import numpy as np
from cv2 import cv2
"""像素运算分为算术运算和逻辑运算,两张图像若想进行像素运算,二者形状必须一致,
数据类型也必须一致"""
"""算术运算有加减乘除,加权叠加,可以用来调节亮度和对比度"""
"""逻辑运算分为与,或,非,可进行遮罩层控制"""
#只有黑白二色的图像,我们称之为mask
#图像的加减乘除都是元素对元素的运算
#==========================算术运算====================================================
def add_demo(img1,img2):
"""像素各个通道对应相加,超过255的截断为255"""
"""白色加任何颜色都是白色,相当于白色覆盖一切"""
"""黑色加任何颜色都不改变原来的颜色,黑色相当于透明"""
dst = cv2.add(img1,img2)
cv2.imshow("add_dst",dst)
def subtract_demo(img1,img2):
"""像素各个通道对应相减,小于零的截断为零"""
"""白色减其他颜色结果不定,会得到五颜六色的结果"""
"""任何颜色减白色都使得像素小于零,截断为零,得到黑色"""
"""黑色减任何颜色会使得该像素小于零,小于零则截断为零,黑色减任何颜色得到黑色"""
"""任何颜色减黑色保持原颜色不变"""
dst = cv2.subtract(img1,img2)
cv2.imshow("subtract_dst",dst)
def divide_demo(img1,img2):
dst = cv2.divide(img1,img2)
cv2.imshow("divide_dst",dst)
def multiply_demo(img1,img2):
dst = cv2.multiply(img1,img2)
cv2.imshow("multiply_dst",dst)
#=========================像素统计=====================================================
def average(img1,img2):
"""展示BGR三个通道各自的平均值"""
"""可以用来统计整幅图像中,BGR中哪种颜色所占比例最大,哪种又是最小"""
mean1 = cv2.mean(img1)
mean2 = cv2.mean(img2)
print(mean1)
print(mean2)
def mean_dev(img1,img2):
"""方法cv2.meanStdDev()不仅可以求出各通道均值,还能求出各通道标准差"""
"""标准差越大说明各个像素之间差异越大"""
"""标准差可以用来判断一张图像是否含有有效信息,标准差过小肯定有问题(纯色图标准差为0)"""
mean1, dev1 = cv2.meanStdDev(img1)
mean2, dev2 = cv2.meanStdDev(img2)
print(mean1)
print(mean2)
print(dev1)
print(dev2)
#==========================逻辑运算====================================================
def logic_and_demo(img1,img2):
"""逻辑与运算,只有两个bit都是1时,两bit的与运算结果才为1"""
"""黑色BGR(0,0,0)数据类型为uint8,所以二进制形态为00000000"""
"""白色BGR(255,255,255)数据类型为uint8,二进制形态为11111111"""
"""由此可见黑色像素与任何颜色进行与运算结果都为黑色,黑色遮挡一切"""
"""白色像素和任何颜色像素进行与运算结果都为原来的颜色,白色相当于透明"""
dst = cv2.bitwise_and(img1,img2)
#注意,若img1或img2中有一个是mask,则它可以作为遮罩层
cv2.imshow("logic_and_dst",dst)
def logic_or_demo(img1,img2):
"""两bit进行或运算,两bit中只要与一个为1,则结果为1"""
"""任何颜色与黑色进行或运算,结果都保持原来的颜色"""
"""任何颜色与白色进行或运算,结果都为白色"""
dst = cv2.bitwise_or(img1,img2)
cv2.imshow("logic_or_dst",dst)
def logic_not_demo(img1):
"""bit_wise_not其实是按位取反,即像素的某个通道二进制形态为10010011,则变为01101100"""
"""注意01101100+10010011=11111111,即255"""
dst = cv2.bitwise_not(img1)
cv2.imshow("logic_not_dst",dst)
#============图像对比度与亮度==================================================================
def contrast_brightness_demo(img,c,b):
"""利用图像的加权叠加来实现对比度的调整,以及亮度的调整,c代表对比度,b代表亮度"""
h, w, ch = img.shape #求出img的高和宽和通道数
blank = np.zeros([h,w,ch],dtype=np.uint8) #生成一张纯黑色图像
dst = cv2.addWeighted(img,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,也就是亮度提高
cv2.imshow("cb_dst",dst)
#==============================================================================
print("--------------------hello python!--------------------")
#载入素材图像
src1 = cv2.imread("D:/Picture/wallhaven-2712.jpg")
src2 = cv2.imread("D:/Picture/wallhaven-4543.jpg")
print(src1.shape,src2.shape)
src3 = np.zeros([720,1280,3],dtype=np.uint8)
src3.fill(255) #创建纯白图像以备使用
src4 = np.zeros([720,1280,3],dtype=np.uint8) #创建纯黑图像以备使用
#==============================================================================
add_demo(src1,src3)
subtract_demo(src1,src3)
divide_demo(src3,src1)
multiply_demo(src1,src2)
average(src1,src2)
mean_dev(src1,src2)
logic_and_demo(src1,src2)
logic_or_demo(src1,src2)
logic_not_demo(src1)
contrast_brightness_demo(src1,2,20)
#==============================================================================
cv2.waitKey(0)
cv2.destroyAllWindows()
本文所涉及的一切图像像素运算,前提都是两张图尺寸相同,通道数相同
import numpy as np
from cv2 import cv2
"""像素运算分为算术运算和逻辑运算,两张图像若想进行像素运算,二者形状必须一致,
数据类型也必须一致"""
"""算术运算有加减乘除,加权叠加,可以用来调节亮度和对比度"""
"""逻辑运算分为与,或,非,可进行遮罩层控制"""
#只有黑白二色的图像,我们称之为mask
#图像的加减乘除都是元素对元素的运算
#==========================算术运算====================================================
def add_demo(img1,img2):
"""像素各个通道对应相加,超过255的截断为255"""
"""白色加任何颜色都是白色,相当于白色覆盖一切"""
"""黑色加任何颜色都不改变原来的颜色,黑色相当于透明"""
dst = cv2.add(img1,img2)
cv2.imshow("add_dst",dst)
def subtract_demo(img1,img2):
"""像素各个通道对应相减,小于零的截断为零"""
"""白色减其他颜色结果不定,会得到五颜六色的结果"""
"""任何颜色减白色都使得像素小于零,截断为零,得到黑色"""
"""黑色减任何颜色会使得该像素小于零,小于零则截断为零,黑色减任何颜色得到黑色"""
"""任何颜色减黑色保持原颜色不变"""
dst = cv2.subtract(img1,img2)
cv2.imshow("subtract_dst",dst)
def divide_demo(img1,img2):
dst = cv2.divide(img1,img2)
cv2.imshow("divide_dst",dst)
def multiply_demo(img1,img2):
dst = cv2.multiply(img1,img2)
cv2.imshow("multiply_dst",dst)
#=========================像素统计=====================================================
def average(img1,img2):
"""展示BGR三个通道各自的平均值"""
"""可以用来统计整幅图像中,BGR中哪种颜色所占比例最大,哪种又是最小"""
mean1 = cv2.mean(img1)
mean2 = cv2.mean(img2)
print(mean1)
print(mean2)
def mean_dev(img1,img2):
"""方法cv2.meanStdDev()不仅可以求出各通道均值,还能求出各通道标准差"""
"""标准差越大说明各个像素之间差异越大"""
"""标准差可以用来判断一张图像是否含有有效信息,标准差过小肯定有问题(纯色图标准差为0)"""
mean1, dev1 = cv2.meanStdDev(img1)
mean2, dev2 = cv2.meanStdDev(img2)
print(mean1)
print(mean2)
print(dev1)
print(dev2)
#==========================逻辑运算====================================================
def logic_and_demo(img1,img2):
"""逻辑与运算,只有两个bit都是1时,两bit的与运算结果才为1"""
"""黑色BGR(0,0,0)数据类型为uint8,所以二进制形态为00000000"""
"""白色BGR(255,255,255)数据类型为uint8,二进制形态为11111111"""
"""由此可见黑色像素与任何颜色进行与运算结果都为黑色,黑色遮挡一切"""
"""白色像素和任何颜色像素进行与运算结果都为原来的颜色,白色相当于透明"""
dst = cv2.bitwise_and(img1,img2)
#注意,若img1或img2中有一个是mask,则它可以作为遮罩层
cv2.imshow("logic_and_dst",dst)
def logic_or_demo(img1,img2):
"""两bit进行或运算,两bit中只要与一个为1,则结果为1"""
"""任何颜色与黑色进行或运算,结果都保持原来的颜色"""
"""任何颜色与白色进行或运算,结果都为白色"""
dst = cv2.bitwise_or(img1,img2)
cv2.imshow("logic_or_dst",dst)
def logic_not_demo(img1):
"""bit_wise_not其实是按位取反,即像素的某个通道二进制形态为10010011,则变为01101100"""
"""注意01101100+10010011=11111111,即255"""
dst = cv2.bitwise_not(img1)
cv2.imshow("logic_not_dst",dst)
#============图像对比度与亮度==================================================================
def contrast_brightness_demo(img,c,b):
"""利用图像的加权叠加来实现对比度的调整,以及亮度的调整,c代表对比度,b代表亮度"""
h, w, ch = img.shape #求出img的高和宽和通道数
blank = np.zeros([h,w,ch],dtype=np.uint8) #生成一张纯黑色图像
dst = cv2.addWeighted(img,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,也就是亮度提高
cv2.imshow("cb_dst",dst)
#==============================================================================
print("--------------------hello python!--------------------")
#载入素材图像
src1 = cv2.imread("D:/Picture/wallhaven-2712.jpg")
src2 = cv2.imread("D:/Picture/wallhaven-4543.jpg")
print(src1.shape,src2.shape)
src3 = np.zeros([720,1280,3],dtype=np.uint8)
src3.fill(255) #创建纯白图像以备使用
src4 = np.zeros([720,1280,3],dtype=np.uint8) #创建纯黑图像以备使用
#==============================================================================
add_demo(src1,src3)
subtract_demo(src1,src3)
divide_demo(src3,src1)
multiply_demo(src1,src2)
average(src1,src2)
mean_dev(src1,src2)
logic_and_demo(src1,src2)
logic_or_demo(src1,src2)
logic_not_demo(src1)
contrast_brightness_demo(src1,2,20)
#==============================================================================
cv2.waitKey(0)
cv2.destroyAllWindows()
相关文章推荐
- python3.6-opencv3.4鼠标交互查看图片像素
- OpenCV 图像对比度和亮度调节
- python的数据增强利用opencv读取图片
- python利用Opencv进行人脸识别(视频流+图片)
- 利用Python和OpenCV将图片URL直接转换成OpenCV的图片格式
- OpenCV-Python:访问像素值并修改、访问图片属性、设置ROI、分割合并图片
- python OpenCV学习笔记(七):图片的算术运算
- Python-OpenCV 处理图像(二)(三):滤镜和图像运算 图像像素点操作
- 使用python利用Image模块检查图片像素是否符合要求
- 图像对比度与亮度调整算法实现(Python&OpenCV)
- 【Python_Demo_4】 利用OpenCv的ROI区域,将衣服图片切成规则的小图片的python程序
- Python opencv(4) 调节图像亮度
- Opencv利用ROI将一张图片叠加到另一幅图像的指定位置
- Python-OpenCV 图像叠加or图像混合加权(cv2.addWeighted)
- OpenCV 2 学习笔记(16): 利用查找表(Look-up table)改善图片质量,增加图像对比度
- 通过OpenCV修改图片某一像素的数值 Python实现
- python中利用opencv简单做图片比对
- python3-opencv库(3)--图片颜色空间转换,利用HSV进行物体跟踪,图像通道分离与合并
- python3-opencv库(2)--遍历图像像素,利用Numpy创建图像,Numpy基本操作
- python3.6+opencv3.4实现鼠标交互查看图片像素