python利用生成器随机调整图片对比度,饱和度,亮度,色度

直接上代码

# -*- coding: utf-8 -*-
"""
Created on Thu Apr 23 22:29:54 2020

@author: Administrator
"""
import numpy as np
import cv2
from PIL import Image
from matplotlib import pyplot as plt

#VisualEffect
class VisualEffect:
    """
    生成从给定间隔均匀采用的视觉效果参数
    参数:
    contrast_factor: 对比度因子:调整对比度的因子区间,应该在0-3之间
    brightness_delta: 亮度增量:添加到像素的量在-1和1之间的间隔
    hue_delta:色度增量:为添加到色调通道的量在-1和1之间的间隔
    saturation_factor:饱和系数:因子乘以每个像素的饱和值的区间
    """
    def __init__(
        self,
        contrast_factor,
        brightness_delta,
        hue_delta,
        saturation_factor
        ):
        self.contrast_factor = contrast_factor
        self.brightness_delta = brightness_delta
        self.hue_delta = hue_delta
        self.saturation_factor = saturation_factor
    
    def __call__(self, image):
        """
        将视觉效果应用到图片上
        """
        if self.contrast_factor:
            image = self.adjust_contrast(image, self.contrast_factor)
            
        if self.brightness_delta:
            image = self.adjust_brightness(image, self.brightness_delta)
            
        if self.hue_delta or self.saturation_factor:
            
            image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) #色彩空间转化
            if self.hue_delta:
                image = self.adjust_hue(image, self.hue_delta)                               
            if self.saturation_factor:
                image = self.adjust_saturation(image, self.saturation_factor)
    
            image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)#色彩空间转化
            image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
        return image
    
    def adjust_saturation(self, image, factor):
        """
        调整图片的饱和度
        """
        image[..., 1] = np.clip(image[..., 1] * factor, 0, 255)
        return image   
    
    
    
    def adjust_hue(self, image, delta):
        """
        调整图片的色度
        添加到色调通道的量在-1和1之间的间隔。
        如果值超过180,则会旋转这些值。
        """
        image[...,0] = np.mod(image[...,0] + delta * 180, 180) #取余数
        return image    
    def adjust_contrast(self, image, factor):
        """
        调整一张图像的对比度
        """
        mean = image.mean(axis=0).mean(axis=0)
        return self._clip((image - mean) * factor + mean)       
    def adjust_brightness(self,image,delta):
        """
        调整一张图片的亮度
        """
        return self._clip(image + delta * 255)  
    def _clip(self,image):
        """
        剪辑图像并将其转换为np.uint8
        """
        return np.clip(image, 0, 255).astype(np.uint8)
            
def _uniform(val_range):
    """
    随机返回值域之间的数值
    """ 
    return np.random.uniform(val_range[0], val_range[1])                
                
def _check_range(val_range, min_val=None, max_val=None):
    """
    检查间隔是否有效
    """
    if val_range[0] > val_range[1]:
        raise ValueError('interval lower bound > upper bound')
    if min_val is not None and val_range[0] < min_val:
        raise ValueError('invalid interval lower bound')
    if max_val is not None and val_range[1] > max_val:
        raise ValueError('invalid interval upper bound')
#定义随机视觉效果生成器
def random_visual_effect_generator(
        contrast_range=(0.9 ,1.1),
        brightness_range=(-.1, .1),
        hue_range=(-0.05, 0.05),
        saturation_range=(0.95, 1.05)):
        _check_range(contrast_range, 0)
        _check_range(brightness_range, -1, 1)
        _check_range(hue_range, -1, 1)
        _check_range(saturation_range, 0)
        def _generate():
            while True:
                yield VisualEffect(
                contrast_factor=_uniform(contrast_range),
                brightness_delta=_uniform(brightness_range),
                hue_delta=_uniform(hue_range),
                saturation_factor=_uniform(saturation_range)
                )
            
        return _generate()  
if __name__ == "__main__":
    path = "C:/Users/Administrator/Desktop/learning_image/lena.jpg"
    image = np.asarray(Image.open(path))
    
    visual_effect_generator = random_visual_effect_generator(
                contrast_range=(0.9, 1.1),
                brightness_range=(-0.1, 0.1),
                hue_range=(-0.05, 0.05),
                saturation_range=(0.95, 1.05)
            )  #创建生成器
    visual_effect = next(visual_effect_generator)
    image = visual_effect(image)
    
    plt.imshow(image)

以lena图为例
调整之前
在这里插入图片描述
调整后
在这里插入图片描述

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很高兴为您解答。您可以使用OpenCV库来实现Python滑块调整图片亮度对比度。下面是Python代码示例: ```python import cv2 import numpy as np def adjustBrightnessContrast(image, brightness, contrast): # 亮度调整 if brightness != 0: if brightness > 0: shadow = brightness highLight = 255 else: shadow = 0 highLight = 255 + brightness alpha_b = (highLight - shadow) / 255 gamma_b = shadow # 映射表 table_b = np.array([((i / 255) * alpha_b + gamma_b) if ((i / 255) * alpha_b + gamma_b) > 0 else 0 for i in range(0, 256)]).astype("uint8") image = cv2.LUT(image, table_b) # 对比度调整 if contrast != 0: f = 131 * (contrast + 127) / (127 * (131 - contrast)) alpha_c = f gamma_c = 127 * (1 - f) # 映射表 table_c = np.array([((i / 255) * alpha_c + gamma_c) if ((i / 255) * alpha_c + gamma_c) > 0 else 0 for i in range(0, 256)]).astype("uint8") image = cv2.LUT(image, table_c) return image # 读取图片 img = cv2.imread('test.jpg') # 创建窗口 cv2.namedWindow('image') # 创建滑块 cv2.createTrackbar('Brightness', 'image', 0, 100, lambda x: None) cv2.createTrackbar('Contrast', 'image', 0, 100, lambda x: None) while True: # 获取滑块值 brightness = cv2.getTrackbarPos('Brightness', 'image') - 50 contrast = cv2.getTrackbarPos('Contrast', 'image') - 50 # 调整亮度对比度 img_adjust = adjustBrightnessContrast(img, brightness, contrast) # 显示图片 cv2.imshow('image', img_adjust) # 按下Q键退出 if cv2.waitKey(1) & 0xFF == ord('q'): break # 释放窗口和摄像头 cv2.destroyAllWindows() ``` 您可以按照上述步骤来实现Python滑块调整图片亮度对比度。希望能对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值