根据photoshop的滤色混合方法,完成一种暗图片的亮度增强手段。
滤色混合和正片叠底的公式
形象理解正片叠底和滤色
代码参考-c
先贴一张效果图
简单来说,正片叠底会使暗图片更暗,滤色混合会使亮图片更亮。
滤色混合步骤很简单:
代码如下
#!/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的一半来决定对该点使用正片叠底还是滤色混合。叠加模式的结果如下,右边是原图像。
然后我就想到如果对图像暗的部分用滤色混合,亮的地方用正片叠底,不久可以很棒的把亮度平均处理了吗。但是我失败了,结果会变成这样。
我不知道为什么会这样,我怀疑是混合色的问题,我再想一想把。最后如果图片仍然不理想可以通过多次重复上面的过程来继续增强。