基于photoshop滤色混合模式的图片亮度改变

暗图片亮度增强

根据photoshop的滤色混合方法,完成一种暗图片的亮度增强手段。
滤色混合和正片叠底的公式
形象理解正片叠底和滤色
代码参考-c
先贴一张效果图

简单来说,正片叠底会使暗图片更暗,滤色混合会使亮图片更亮。
滤色混合步骤很简单:

  1. 将绿色通道反色后作为系数值,分别与各个通道相乘,得到新图层;
  2. 将新图层与原图做一次滤色混合,f(a, b) = 1 - (1 - a)*(1 - b);
    其中a是底色,就是原图片,b是混合色,参考代码中用绿色通道的值作为混合色。我尝试了,无论是rgb里面的哪一个通道,或者hsv中的v通道,效果都可以。有人说是因为人眼对绿色敏感且绿色对亮度影响打,这里我也不知道对不对。

代码如下

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2020/5/20 9:19
# @Author : Hran
# @Site : 
# @File : photoshop.py
# @Software: PyCharm
"""
将新图层与原图做一次滤色混合,f(a, b) = 1 - (1 - a)*(1 - b);
"""
import cv2
import numpy as np


def lvse_screen_xy(x, y):
    """
    滤色模式下的公式
    :param x: 基色
    :param y: 混合色
    :return: 混合后的颜色
    """
    return (255 - ((255-(x)) * (255-(y)) >> 8))


def diejia_screen_xy(x,y):
    """
    叠加模式,结合了正片叠底和滤色模式两种模式的优缺点
    :param x: 基色
    :param y: 混合色
    :return:
    """
    if (x / 255) > 0.5:
   		# 正片叠底公式(注意这里单纯的正片叠底公式是没有乘2的)
        return (2 * (x * y) >> 8)
    else:
    	# 滤色混合公式(注意这里单纯的滤色混合公式是没有乘2的)
        return (255 - 2 * ((255-(x)) * (255-(y)) >> 8))

def work(img):
    height = img.shape[0]
    width = img.shape[1]
    img_size = height * width

    img_flatten = np.reshape(img, (-1, 3))

    for i in range(img_size):
        g_alpha = 255 - img_flatten[i][2]
        b_temp = img_flatten[i][0] * g_alpha >> 8
        g_temp = img_flatten[i][1] * g_alpha >> 8
        r_temp = img_flatten[i][2] * g_alpha >> 8

        img_flatten[i][0] = lvse_screen_xy(img_flatten[i][0], b_temp)
        img_flatten[i][1] = lvse_screen_xy(img_flatten[i][1], g_temp)
        img_flatten[i][2] = lvse_screen_xy(img_flatten[i][2], r_temp)

        # img_flatten[i][0] = diejia_screen_xy(img_flatten[i][0], b_temp)
        # img_flatten[i][1] = diejia_screen_xy(img_flatten[i][1], g_temp)
        # img_flatten[i][2] = diejia_screen_xy(img_flatten[i][2], r_temp)

    result = np.reshape(img, (height, width, 3))
    return result

if __name__ == '__main__':
    img = cv2.imread('1.png')

    result = work(img)

    # for i in range(3):
    #     result = work(result)

    cv2.imshow('img', result)
    cv2.waitKey()

代码中的diejia_screen_xy(x,y)对应着叠加模式,是正片叠底和滤色的结合。会使暗图片更暗,亮图片更亮。公式中给的是通过判断该点的像素值是不是255的一半来决定对该点使用正片叠底还是滤色混合。叠加模式的结果如下,右边是原图像。
基于photoshop滤色混合模式的图片亮度改变_第1张图片
然后我就想到如果对图像暗的部分用滤色混合,亮的地方用正片叠底,不久可以很棒的把亮度平均处理了吗。但是我失败了,结果会变成这样。

我不知道为什么会这样,我怀疑是混合色的问题,我再想一想把。最后如果图片仍然不理想可以通过多次重复上面的过程来继续增强。

你可能感兴趣的:(逆光图像处理,python,计算机视觉,opencv)