You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 12:45:36