使用Python Numpy实现霓虹发光效果的HSV参数调整问题
解决霓虹效果的饱和度与明度参数调整问题
你的边缘检测和距离计算逻辑是正确的,问题出在饱和度(S)和明度(V)与距离的映射曲线不符合霓虹发光的需求。以下是针对性的调整方案:
核心需求对应映射逻辑
- 饱和度(S):边缘处(距离=0)为0,随距离增加快速且显著提升至最大值255。采用指数增长曲线,避免线性增长的平缓感。
- 明度(V):边缘处(距离=0)为255(对应HSV的V=1),随距离增加快速衰减,模拟霓虹的发光衰减效果。
修改后的代码
from PIL import Image import cv2 import numpy as np from scipy.ndimage import binary_erosion from scipy.spatial import KDTree def find_closest_distance(img): white_pixel_points = np.array(np.where(img)) tree = KDTree(white_pixel_points.T) img_meshgrid = np.array(np.meshgrid(np.arange(img.shape[0]), np.arange(img.shape[1]))).T distances, _ = tree.query(img_meshgrid) return distances def find_edges(img): img_np = np.array(img) kernel = np.ones((3,3)) return img_np - binary_erosion(img_np, kernel)*255 img = Image.open('a.png').convert('L') edge_image = find_edges(img) distance_image = find_closest_distance(edge_image) max_dist = np.max(distance_image) distance_image = distance_image / max_dist # 归一化到0-1范围 # 固定色相(保持原蓝色调) hue = np.full(distance_image.shape, 0.44*180) # 饱和度:指数增长,边缘处为0,随距离快速提升到255 # k值控制增长速度,建议范围3-8,越大增长越快 saturation = 255 * (1 - np.exp(-distance_image * 5)) # 明度:高斯衰减,边缘处最亮,随距离快速变暗 # m值控制衰减速度,建议范围2-6,越大衰减越快 value = 255 * np.exp(-(distance_image * 4)**2) new_tups = np.dstack((hue, saturation, value)).astype('uint8') new_tups = cv2.cvtColor(new_tups, cv2.COLOR_HSV2BGR) new_img = Image.fromarray(new_tups, 'RGB').save('out.png')
参数调整说明
- 饱和度
k值:若颜色不够鲜艳,增大k(如8);若过渡太突兀,减小k(如3)。 - 明度
m值:若发光范围太窄,减小m(如2);若发光范围太宽,增大m(如6)。 - 色相可按需调整:0为红色,60为黄色,120为绿色,180为青色,240为蓝色,300为品红色。
效果优化逻辑
原代码采用线性增长的饱和度、幂次衰减的明度,无法实现“边缘无色彩、远处色彩饱和;边缘高亮、远处快速变暗”的霓虹感。修改后的指数增长+高斯衰减曲线,精准匹配需求的发光特性。
内容的提问来源于stack exchange,提问作者user18615293
相关产品推荐
相关产品推荐

