见 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、阴影区抠图
和 PS 对比图,如下图左边是用 PS 选出的阴影区,右边是通过 Python 选出的阴影区,低于阈值的像素全部置黑
2、高光区抠图
和 PS 对比图,如下图左边是用 PS 选出的高光区,右边是通过 Python 选出的高光区,低于阈值的像素全部置黑
转载:https://blog.csdn.net/u011520181/article/details/116244184
查看评论