python图片颜色迁移_opencv 直方图匹配 图片颜色迁移

本文介绍了如何使用Python和OpenCV库实现图片颜色迁移,通过直方图匹配算法改变目标图像的颜色分布,使其接近源图像。代码示例展示了从一张图像(如autumn.jpg)到另一张图像(如greentree.jpg)的颜色迁移过程,并显示了迁移前后的图像对比。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值