两张原始图片,相互迁移颜色

0863d0917d95ad1ff320417b9abe5809.png

80689083112ed36581ee83b0e4986723.png

结果

93846ccf2c0ba2082bd8fe9a378e69b6.png

5fb4fec372cf89ea241fc006a9e7a466.png

因为直方图可以表示颜色的分布情况,而通过直方图匹配算法可以将一幅图像的直方图分布复制给另一副图,从而让目标图像拥有原始图像信息

首先计算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

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐