一、光照滤镜核心代码
新建 light_effect.py 文件
import cv2
import math
import numpy as np
def lighteffect_fun(instance):
# 读取原始图像
original_image = instance.m_image
# 获取图像的行和列
original_rows, original_cols = original_image.shape[:2]
#设置中心点
centerX = original_rows/2
centerY = original_cols/2
radius = min(centerX,centerY)
#设置光照强度
strength = 200
#新建目标图像
light_effect_img = np.zeros((original_rows,original_cols,3),dtype="uint8")
#图片光照特效
for i in range(original_rows):
for j in range(original_cols):
#计算当前点到光照中心的距离
distance = math.pow(centerX-i,2)+math.pow(centerY-j,2)
#获取原始图像
R = original_image[i,j][0]
G = original_image[i,j][1]
B = original_image[i,j][2]
if(distance<radius*radius):
#按照距离大小计算增强的光照值
result = (int)(strength*(1.0-math.sqrt(distance)/radius))
R = original_image[i,j][0] +result
G = original_image[i,j][1] +result
B = original_image[i,j][2] +result
#判断边界,防止越界
R = min(255,max(0,R))
G = min(255,max(0,G))
B = min(255,max(0,B))
light_effect_img[i,j] = np.uint8((R,G,B))
else:
light_effect_img[i, j] = np.uint8((R, G, B))
instance.m_image = light_effect_img
instance.updata_image()
代码思想:
设置光照中心,再根据每个像素到光照中心的距离计算增强的光照值。
二、UI界面
1.在对应UI.py文件中添加action
# 创建一个action,当该action被触发时显示光照特效处理后的图片
action_light_img_show = QAction('&光照滤镜', instance)
action_light_img_show.triggered.connect(instance.light_effect_emit)
# 艺术风格迁移选项新增一个action:光照滤镜
tempMenu.addAction(action_light_img_show)
2.在主UI.py文件中添加信号发射函数
引入模块
from part3 import m_init_style_transfer,glass_effect,paint_effect,pasttime_effect,light_effect
定义信号发射函数
def light_effect_emit(self):
light_effect.lighteffect_fun(self)
三、实现效果
效果如下: