两张原始图片,相互迁移颜色
结果
因为直方图可以表示颜色的分布情况,而通过直方图匹配算法可以将一幅图像的直方图分布复制给另一副图,从而让目标图像拥有原始图像信息
首先计算src与目标图像dst的归一化之后的直方图统计,得到的结果为概率密度分布。
使用cumsum累加概率密度分布,得到累计分布
在原始图像的累计分布中搜索目标图像的累计分布所对应的下标index,由于累计分布是递增函数,因此可以使用二分查找
调用clip将index的取值范围限制在0--255之间
然后用他对目标函数进行映射,即将目标图像中的每个像素值v替换为index【v】
import cv2 as cv
import numpy as np
def his_match(src, dst):
res = np.zeros_like(dst)
# cdf 为累计分布
cdf_src = np.zeros((3, 256))
cdf_dst = np.zeros((3, 256))
cdf_res = np.zeros((3, 256))
kw = dict(bins=256, range=(0, 256), normed=True)
for ch in range(3):
his_src, _ = np.histogram(src[:, :, ch], **kw)
hist_dst, _ = np.histogram(dst[:, :, ch], **kw)
cdf_src[ch] = np.cumsum(his_src)
cdf_dst[ch] = np.cumsum(hist_dst)
index = np.searchsorted(cdf_src[ch], cdf_dst[ch], side='left')
np.clip(index, 0, 255, out=index)
res[:, :, ch] = index[dst[:, :, ch]]
his_res, _ = np.histogram(res[:, :, ch], **kw)
cdf_res[ch] = np.cumsum(his_res)
return res, (cdf_src, cdf_dst, cdf_res)
src = cv.imread('greentree.jpg')
# src = cv.imread('flower.jpg')
# src = cv.imread('summer.jpg')
dst = cv.imread('autumn.jpg')
# dst = cv.imread('greentree.jpg')
# src = cv.imread('autumn.jpg')
# dst = cv.imread('greentree.jpg')
cv.imshow('src', src)
cv.imshow('dst', dst)
res, cdfs = his_match(src, dst)
cv.imshow('res', res)
print(cdfs[0].shape)
cv.waitKey(0)
转载至链接:https://my.oschina.net/ahaoboy/blog/1933923