好用的亮度增强(轮子)
好用的亮度拉伸:
import cv2 import numpy as np import os def zmMinFilterGray(src, r=7): '''最小值滤波,r是滤波器半径''' '''if r <= 0: return src h, w = src.shape[:2] I = src res = np.minimum(I , I[[0]+range(h-1) , :]) res = np.minimum(res, I[range(1,h)+[h-1], :]) I = res res = np.minimum(I , I[:, [0]+range(w-1)]) res = np.minimum(res, I[:, range(1,w)+[w-1]]) return zmMinFilterGray(res, r-1)''' return cv2.erode(src, np.ones((2 * r + 1, 2 * r + 1))) # 使用opencv的erode函数更高效 def guidedfilter(I, p, r, eps): '''引导滤波,直接参考网上的matlab代码''' height, width = I.shape m_I = cv2.boxFilter(I, -1, (r, r)) m_p = cv2.boxFilter(p, -1, (r, r)) a =I * p m_Ip = cv2.boxFilter(I * p, -1, (r, r)) cov_Ip = m_Ip - m_I * m_p m_II = cv2.boxFilter(I * I, -1, (r, r)) var_I = m_II - m_I * m_I a = cov_Ip / (var_I + eps) b = m_p - a * m_I m_a = cv2.boxFilter(a, -1, (r, r)) m_b = cv2.boxFilter(b, -1, (r, r)) return m_a * I + m_b def getV1(m, r, eps, w, maxV1): # 输入rgb图像,值范围[0,1] '''计算大气遮罩图像V1和光照值A, V1 = 1-t/A''' V1 = np.min(m, 2) # 得到暗通道图像 V1 = guidedfilter(V1, zmMinFilterGray(V1, 7), r, eps) # 使用引导滤波优化 bins = 2000 a = np.mean(V1) ht = np.histogram(V1, bins) # 计算大气光照A d = np.cumsum(ht[0]) / float(V1.size) for lmax in range(bins - 1, 0, -1): if d[lmax] <= 0.999: break s = ht[1][lmax] A = np.mean(m, 2)[V1 >= ht[1][lmax]].max() print("A:", A) V1 = np.minimum(V1 * w, maxV1) # 对值范围进行限制 return V1, A def deHaze(m, r=81, eps=0.001, w=0.95, maxV1=0.80, bGamma=False): Y = np.zeros(m.shape) V1, A = getV1(m, r, eps, w, maxV1) # 得到遮罩图像和大气光照 for k in range(3): Y[:, :, k] = (m[:, :, k] - V1) / (1 - V1 / A) # 颜色校正 Y = np.clip(Y, 0, 1) if bGamma: Y = Y ** (np.log(0.5) / np.log(Y.mean())) # gamma校正,默认不进行该操作 return Y if __name__ == '__main__': path = r'C:\Users\shi\Desktop\jyz' aug_path = r"C:\Users\shi\Desktop\jyz_out" for i, im in enumerate(os.listdir(path)): print(im) # print(os.path.join(path, im)) m = cv2.imdecode(np.fromfile(os.path.join(path, im), dtype=np.uint8), cv2.IMREAD_COLOR) # m = deHaze(m/ 255.0) * 255 # m = deHaze(m / 255.0)* 255 m = 255 - m m = 255 - deHaze(m / 255.0) * 255 new_name = im[:-4] + '.png' # print(new_name) # cv2.imwrite(os.path.join(aug_path, new_name),m) cv2.imencode('.png', m)[1].tofile(os.path.join(aug_path, im))
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异