• 对比度调节 改变图像对比度原理:
    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)