对比度调节 改变图像对比度原理:
gbr色彩空间——以127为分界线,小于127的会越小,大于127的会越大
达成“亮的越亮,暗的越暗”的效果
图像灰度化:
在RGB模型中,如果R=G=B时,则彩色表示一种灰度颜色,其中R=G=B的值叫灰度值,因此,灰度图像每个像素只需一个字节存放灰度值(又称强度值、亮度值),灰度范围为0-255。0%的灰度RGB数值是255,255,255;1%灰度的RGB数值是253,253,253;2%灰度RGB值为250,250,250。
图像灰度化:在RGB模型中,如果R=G=B时,则彩色表示一种灰度颜色,其中R=G=B的值叫灰度值,因此,灰度图像每个像素只需一个字节存放灰度值(又称强度值、亮度值),灰度范围为0-255。0%的灰度RGB数值是255,255,255;1%灰度的RGB数值是253,253,253;2%灰度RGB值为250,250,250。
图像灰度化处理一般采用以下三种算法: 平均值法: f(i,j)=(R(i,j)+G(i,j)+B(i,j))/3 最大值法: f(i,j)=max(R(i,j),G(i,j),B(i,j)) 加权平均值法:f(i,j)=0.30R(i,j)+0.59G(i,j)+0.11B(i,j)
OpenCV中图像的基本运算
打开图像文件、显示图像文件、访问像素颜色值等
使用函数cv2.imread(filepath,flags)读入一副图片
filepath:要读入图片的完整路径
flags:读入图片的标志
cv2.IMREAD_COLOR:默认参数,读入一副彩色图片,忽略alpha通道,可以直接写1
cv2.IMREAD_GRAYSCALE:读入灰度图片,可以直接写0
cv2.IMREAD_UNCHANGED:顾名思义,读入完整图片,包括alpha通道,可以直接写-1
对于imshow函数,opencv的官方注释指出:根据图像的深度,imshow函数会自动对其显示灰度值进行缩放,规则如下:
如果图像数据类型是8U(8位无符号),则直接显示。
如果图像数据类型是16U(16位无符号)或32S(32位有符号整数),则imshow函数内部会自动将每个像素值除以256并显示,即将原图像素值的范围由[0 ~ 255*256]映射到[0~255]
如果图像数据类型是32F(32位浮点数)或64F(64位浮点数),则imshow函数内部会自动将每个像素值乘以255并显示,即将原图像素值的范围由[0~ 1]映射到[0~255](注意:原图像素值必须要归一化)
可以通过坐标来访问像素值
"""
改变图像亮度和饱和度原理:
gbr图像转换为hsv
v-色调 s-饱和度 h-色相
H、S、V值范围分别是[0,180),[0,255),[0,255)
改变图像对比度原理:
gbr色彩空间——以127为分界线,小于127的会越小,大于127的会越大
达成“亮的越亮,暗的越暗”的效果
可以改进(判断图片整体亮度,以此为根据设置分界标准)
@Author:cara j
"""
import cv2 as cv
import numpy as np
import time
# 读取图像
def read(url):
img = cv.imread(url, 1)
if img.shape[0] >= 400:
HEIGHT_MAX = 400
height, width, _ = img.shape
ration = HEIGHT_MAX / height
width = int(width * ration)
height = HEIGHT_MAX
img_resize = cv.resize(img, (width, height))
return img_resize
return img
# 改变图像亮度
def change_brightness(img, x):
# rgb转化为hsv
img_t = cv.cvtColor(img, cv.COLOR_BGR2HSV)
# 获取hsv
h, s, v = cv.split(img_t)
# 增加亮度 色调越浅越亮
v1 = np.clip(cv.add(v, x), 0, 255)
img1 = np.uint8(cv.merge((h, s, v1)))
img1 = cv.cvtColor(img1, cv.COLOR_HSV2BGR)
return img1
# 改变图像饱和度
def change_saturation(img, x):
# rgb转化为hsv
img_t = cv.cvtColor(img, cv.COLOR_BGR2HSV)
# 获取hsv
h, s, v = cv.split(img_t)
# 增加饱和度 饱和度越低,越接近灰度图像
s1 = np.clip(cv.add(s, x), 0, 255)
img2 = np.uint8(cv.merge((h, s1, v)))
img2 = cv.cvtColor(img2, cv.COLOR_HSV2BGR)
return img2
# 改变图像对比度
def change_contrast(img, alpha):
dst = np.ones(img.shape)
img3 = np.uint8(np.clip(alpha * (img - 127 * dst) + 127 * dst, 0, 255))
return img3
# 图片展示
def show(old_img, new_img):
cv.imshow('image', np.hstack((old_img, new_img)))
cv.waitKey(0)
if __name__ == '__main__':
time_start = time.time()
image = read("imgs/pic.jpg")
# new_image = change_brightness(image, 50)
# new_image = change_saturation(image, 50)
new_image = change_contrast(image, 2.0)
time_end = time.time()
print('time cost', time_end - time_start, 's')
show(image, new_image)