如何使用OpenCV修复图片褪色区域,使中心区域颜色与边缘一致
褪色中心区域色彩还原方案
你之前用直方图均衡失败的核心原因是全局直方图均衡会拉伸全图的像素分布,反而放大中心和边缘的色彩差异,正确的做法是采用边缘区域为基准的直方图匹配,直接把中心区域的色彩分布对齐到未褪色的边缘区域。
两种实现方式
1. 无代码方案(Photoshop操作)
- 用矩形选框工具框选中心需要修复的褪色正方形区域
- 顶部菜单栏选择
图像>调整>匹配颜色 - 弹出面板中「源」选择当前打开的图片,「图层」选择「合并的」,确认后系统会自动将选中区域的色彩匹配到全图(即边缘未褪色区域)的色彩分布
- 最后用模糊度为1-2的模糊工具轻擦选区边缘,消除拼接痕迹即可
2. 代码方案(Python+OpenCV实现)
import cv2 import numpy as np def hist_match(source, template): # 单通道直方图匹配函数 oldshape = source.shape source = source.ravel() template = template.ravel() # 计算源和模板的累计分布函数 s_values, bin_idx, s_counts = np.unique(source, return_inverse=True, return_counts=True) t_values, t_counts = np.unique(template, return_counts=True) s_quantiles = np.cumsum(s_counts).astype(np.float64) s_quantiles /= s_quantiles[-1] t_quantiles = np.cumsum(t_counts).astype(np.float64) t_quantiles /= t_quantiles[-1] # 插值映射 interp_t_values = np.interp(s_quantiles, t_quantiles, t_values) return interp_t_values[bin_idx].reshape(oldshape) # 读取原始图片 img = cv2.imread("input.png") h, w = img.shape[:2] # 按需调整参数:中心褪色正方形的左上角(x1,y1)、右下角(x2,y2)坐标 x1, y1, x2, y2 = 200, 200, 600, 600 # 提取目标修复区域、边缘参考区域 target_roi = img[y1:y2, x1:x2] mask = np.ones((h, w), dtype=bool) mask[y1:y2, x1:x2] = False ref_roi = img[mask] # 三通道分别做直方图匹配 for c in range(3): target_roi[:,:,c] = hist_match(target_roi[:,:,c], ref_roi[:,c]) # 边缘高斯模糊过渡,消除拼接边界 blur_k = 3 edge_mask = np.zeros((y2-y1, x2-x1), dtype=np.uint8) edge_mask[blur_k:-blur_k, blur_k:-blur_k] = 255 blur_target = cv2.GaussianBlur(target_roi, (blur_k, blur_k), 0) target_roi = np.where(edge_mask[...,None]==255, target_roi, blur_target) # 保存结果 img[y1:y2, x1:x2] = target_roi cv2.imwrite("fixed_output.png", img)
问题附图
- 原始图片:

- 直方图均衡化失败效果:

内容的提问来源于stack exchange,提问作者Processor99
相关产品推荐
相关产品推荐

