背景
在图像处理中,发现目前样本可能有很多过度曝光。例如,我们的摄像头位于变电站内,阳光射到某些设备上,可能会导致现有模型无法识别这些部件。
因此,我们尝试了模拟增加光照的效果,原文链接二十五.图像特效处理之素描、怀旧、光照、流年以及滤镜特效。
效果
增加图像光照特效后,图中出现了一个圆形的光照效果:
如果需要改进,还可以出现椭圆形的光照效果,例如,你可以先用二维高斯函数生成一组光照模板,然后直接加到图像中,或者你可以利用多元高斯函数,生成更加符合真实情况的光照。
例如下图,有两个较为明亮的峰值,峰值越高,亮度越大:
代码
生成圆形光找的代码如下。如果需要实现符合高斯分布的函数,你还可以进一步的优化代码。
#coding:utf-8
import cv2
import math
import numpy as np
#读取原始图像
img = cv2.imread('scenery.png')
#获取图像行和列
rows, cols = img.shape[:2]
#设置中心点
centerX = rows / 2
centerY = cols / 2
print centerX, centerY
radius = min(centerX, centerY)
print radius
#设置光照强度
strength = 200
#新建目标图像
dst = np.zeros((rows, cols, 3), dtype="uint8")
#图像光照特效
for i in range(rows):
for j in range(cols):
#计算当前点到光照中心距离(平面坐标系中两点之间的距离)
distance = math.pow((centerY-j), 2) + math.pow((centerX-i), 2)
#获取原始图像
B = img[i,j][0]
G = img[i,j][1]
R = img[i,j][2]
if (distance < radius * radius):
#按照距离大小计算增强的光照值
result = (int)(strength*( 1.0 - math.sqrt(distance) / radius ))
B = img[i,j][0] + result
G = img[i,j][1] + result
R = img[i,j][2] + result
#判断边界 防止越界
B = min(255, max(0, B))
G = min(255, max(0, G))
R = min(255, max(0, R))
dst[i,j] = np.uint8((B, G, R))
else:
dst[i,j] = np.uint8((B, G, R))
#显示图像
cv2.imshow('src', img)
cv2.imshow('dst', dst)
cv2.waitKey()
cv2.destroyAllWindows()