python - 两幅图像之间的颜色转移,其中一幅图像为纯色
问题描述
我遇到了这个使用 OpenCV 的特殊颜色转移教程:
https://www.pyimagesearch.com/2014/06/30/super-fast-color-transfer-images/
并像这样实现它:
def color_transfer(source, target):
# compute color statistics for the source and target images
source = cv2.cvtColor(source, cv2.COLOR_BGR2LAB).astype("float32")
target = cv2.cvtColor(target, cv2.COLOR_BGR2LAB).astype("float32")
# compute color stats for both images
(lMeanSrc, lStdSrc, aMeanSrc, aStdSrc, bMeanSrc, bStdSrc) = self.image_stats(source)
(lMeanTar, lStdTar, aMeanTar, aStdTar, bMeanTar, bStdTar) = self.image_stats(target)
# split the color space
(l, a, b) = cv2.split(target)
# substract the means from target image
l -= lMeanTar
a -= aMeanTar
b -= bMeanTar
# check values
print(lStdSrc, aStdSrc, bStdSrc)
print(lStdTar, aStdTar, bStdTar)
print(lMeanSrc, aStdSrc, bMeanSrc)
# process lab computation
l = (lStdSrc / lStdTar) * l
a = (aStdSrc / aStdTar) * a
b = (bStdSrc / bStdTar) * b
# add the source mean
l += lMeanSrc
a += aMeanSrc
b += bMeanSrc
# clipping the pixels between 0 and 255
l = np.clip(l, 0, 255)
a = np.clip(a, 0, 255)
b = np.clip(b, 0, 255)
# merge the channels
transfer = cv2.merge([l, a, b])
# converting back to BGR
transfer = cv2.cvtColor(transfer.astype("uint8"), cv2.COLOR_LAB2BGR)
return transfer
在这个特定的代码中:
# process lab computation
l = (lStdSrc / lStdTar) * l
a = (aStdSrc / aStdTar) * a
b = (bStdSrc / bStdTar) * b
它得到了源的标准差,所以当我们将源图像和目标图像结合起来时,它也会变成一个普通的图像,因为实验室都是 0。
我怎样才能解决这个问题?当源图像不是带有颜色的普通图像时,它可以工作。
解决方案
推荐阅读
- react-native - 仅在登录后才反应本机抽屉
- c++ - 如何将 boost::string_view 转换为 std::string_view?
- python - 关于python中的登录过程
- python - Python使用索引签入列表
- java - 为什么我的 IntelliJ 项目上的运行功能不起作用?它变灰了
- javascript - 意外的令牌 <,javascript 文件被呈现为 html?
- sql - 如何复制现有列但所有值“一个单元格向上”,但由不同的列分区?
- python - 使用 dask 和 pandas 为大型数据集生成排列
- css - 如何在课堂上写一堂课
- python - 用于选择满足特定条件的日期范围的 for 循环