stable diffusion中的relight(重打光)功能分析
stable diffusion中的relight(重打光)功能分析
前言
例如:随着AIGC的不断发展,stable diffusion的不断完善,Stable AI公司提出了新的生成模型SDXL模型,并于今年3月份收购了clipdrop公司,原始的clipdrop公司是研究抠图、更换背景等功能,Stable AI将最新的 Stable Diffusion 模型及技术都集成它的网站中,目前它一共包含 9 项功能,分别是:
- Stable Diffusion XL:根据文本生成高质量图像,基于最新的 SDXL 0.9 模型
- Uncrop:对本地图像进行外绘拓展
- Reimagine XL:根据一张图像生成类似变体
- Replace Background:通过文本为图像生成新背景 (收费)
- Cleapup:一键抹除画面中不需要的元素
- Remove Background:一键扣除图像背景
- Relight:对图像实现立体打光
- Image Upscaler:对图像放大、降噪及锐化
- Text Remover:从图像中无痕抹除文字内容
我们当前主要介绍relight功能,重打光,当前clipdrop网站时公开的,部分功能是免费的,但是网站需要VPN国内才能访问,网站地址:[https://clipdrop.co/]
一、relight的介绍
Relight 可以对一张照片实现立体打光,背后的原理是根据照片中的光影信息算出深度信息和表面法线,当图片中加入新的光源时,这个模型就能预测并模拟出新的光照效果,所以 Relight 在具有立体感的人像摄影照片和写实油画上的效果最好。
二、代码
当前试用了clipdrop中的relight功能,发现基本上颜色和距离可以实时调控,所以尝试使用传统方法来完成该功能。
下面介绍我们使用python中的opencv函数完成的效果。
原始图片效果
添加光源后的效果图
1.代码展示
代码如下(示例):
import cv2
import math
import numpy as np
import matplotlib.pyplot as plt
#读取原始图像
img = cv2.imread('1.jpg')
#获取图像大小
rows, cols = img.shape[:2]
#设置光源中心点坐标和半径
centerX = 200
centerY = 200
print (centerX, centerY)
radius = 200
print (radius)
#设置光源的光照强度
strength = 200
#图像光照特效设置
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))
img[i,j] = np.uint8((B, G, R))
else:
#距离超出半径范围,保留原始像素值
img[i,j] = np.uint8((B, G, R))
#显示图像
cv2.imwrite('test.jpg', img)
plt.imshow(img)
plt.show()
2.彩色光源设置
实现不同颜色的光源:
添加光源的原理同上,添加不同颜色的光源就要在不同分量的颜色添加上做文章了,简单来说,如果要添加红色光源,只要在R分量上添加,其他分量不变,就会出现红色光源效果,以此类推,如果要添加黄色光源,黄色是红色与绿色的叠加色,因此只添加R和G,就可以实现黄色光源,另外如果需要不同组合的颜色光源,只需将目标色进行分解,再根据具体情况为当前操作像素点的不同颜色分量加上不同大小的增量。
添加红色光源的效果图如下所示:
添加绿色光源的效果图如下所示:
添加蓝色光源的效果图如下所示:
红色光源实现代码如下(示例):
# B = img[i,j][0] + result
# G = img[i,j][1] + result
R = img[i,j][2] + result
同理,绿色光源和蓝色光源的效果图同样可以实现。
要想实现叠加色,例如黄色光的效果图,只需要将G和R修改,即可得到黄色光效果。
黄色光源实现代码如下(示例):
# B = img[i,j][0] + result
G = img[i,j][1] + result
R = img[i,j][2] + result
黄色光源效果图:
总结
提示:这里对文章进行总结:
该文主要介绍了利用传统的opencv方法进行relight功能的实现。