Python 用 OpenCV 实现 PS 高光/阴影选区

见 PS 高光/阴影 精准选区方法,现用 Python 代码实现类似的 PS 中高光/阴影选区。代码如下:

# -*- coding: utf-8 -*-
# @Time    : 2021-04-28 20:45
# @Author  : AlanWang4523
# @FileName: py_select_shadows_highlight.py

import os
import sys
import cv2
import numpy as np



def hanlde_img(path):
    # 根据路径读取图片
    img = cv2.imread(path)

    img = img.astype(np.float)/255.0

    # 分离 RGB 三个通道,注意:openCV 中图像格式是 BGR
    srcR = img[:, :, 2]
    srcG = img[:, :, 1]
    srcB = img[:, :, 0]

    # 将原图转成灰度图
    grayImg = 0.299 * srcR + 0.587 * srcG + 0.114 * srcB

    # 高光选区
    # maskThreshold = 0.64
    # luminance = grayImg * grayImg
    # luminance = np.where(luminance > maskThreshold, luminance, 0)


    # 阴影选区
    maskThreshold = 0.33
    luminance = (1 - grayImg) * (1 - grayImg)
    luminance = np.where(luminance > maskThreshold, luminance, 0)

    mask = luminance > maskThreshold

 
    # 显示正交叠底图
    # img[:, :, 0] = luminance
    # img[:, :, 1] = luminance
    # img[:, :, 2] = luminance

    # 显示选区内原图
    img[:, :, 0][~mask] = 0
    img[:, :, 1][~mask] = 0
    img[:, :, 2][~mask] = 0

    img = img * 255
    img = img.astype(np.uint8)

    # 创建图片显示窗口
    title = "ShadowHighlight"
    cv2.namedWindow(title, cv2.WINDOW_NORMAL)   
    cv2.resizeWindow(title, 800, 600)
    cv2.moveWindow(title, 0, 0)
    while True:
        # 循环显示图片,按 ‘q’ 键退出
        cv2.imshow(title, img)
        if cv2.waitKey(1) == ord('q'):
            break
    cv2.destroyAllWindows() 


if __name__ == '__main__':
    '''
        运行环境:Python 3
        执行:python3 py_pic_handle.py <图片路径>
        如:python3 py_pic_handle.py test.jpg
    '''
    if len(sys.argv) == 1:
        print("参数错误:未传入图片路径!")
        sys.exit(-1)
    img_path = sys.argv[1]
    print("img_path Params:", img_path)
    hanlde_img(img_path)

1、阴影区抠图
Python 用 OpenCV 实现 PS 高光/阴影选区_第1张图片

和 PS 对比图,如下图左边是用 PS 选出的阴影区,右边是通过 Python 选出的阴影区,低于阈值的像素全部置黑
Python 用 OpenCV 实现 PS 高光/阴影选区_第2张图片
2、高光区抠图
Python 用 OpenCV 实现 PS 高光/阴影选区_第3张图片
和 PS 对比图,如下图左边是用 PS 选出的高光区,右边是通过 Python 选出的高光区,低于阈值的像素全部置黑
Python 用 OpenCV 实现 PS 高光/阴影选区_第4张图片

你可能感兴趣的:(OpenCV,图像处理,Python,python,opencv,图像处理,PS,阴影高光)