Python 还能实现图片去雾?FFA 去雾算法、暗通道去雾算法( 二 )
使用
python test.py --task='its or ots' --test_imgs='test_imgs'来测试模型效果:
最终得到效果如下:
本文插图
暗通道去雾算法搭建
何恺明的暗通道先验(dark channel prior)去雾算法是CV界去雾领域很有名的算法 , 关于该算法的论文''Single Image Haze Removal Using DarkChannel Prior''一举获得2009年CVPR最佳论文 。 作者统计了大量的无雾图像 , 发现一条规律:每一幅图像的每一个像素的RGB三个颜色通道中 , 总有一个通道的灰度值很低 。 基于这个几乎可以视作是定理的先验知识 , 作者提出暗通道先验的去雾算法 。
对于任意一幅输入图像 , 定义其暗通道的数学表达式为:
本文插图
文章中介绍的方法是软抠图的方法 , 此方法过程复杂 , 速度缓慢 , 因此采用导向滤波对传输函数进行滤波 。 导向滤波的原理此处不再赘述 , 其伪代码为:
本文插图
1、滤波函数:
定义最小值滤波函数:
def zmMinFilterGray(src, r=7):'''if r <= 0:returnsrch, w =src.shape[:2]I = srcres =np.minimum(I, I[[0]+range(h-1), :])res =np.minimum(res, I[range(1,h)+[h-1], :])I = resres =np.minimum(I, I[:, [0]+range(w-1)])res =np.minimum(res, I[:, range(1,w)+[w-1]])returnzmMinFilterGray(res, r-1)'''return cv2.erode(src,np.ones((2*r+1, 2*r+1)))引导滤波函数的实现:
def guidedfilter(I, p, r, eps):'''引导滤波 , 直接参考网上的matlab代码'''height, width = I.shapem_I = cv2.boxFilter(I, -1, (r,r))m_p = cv2.boxFilter(p, -1, (r,r))m_Ip = cv2.boxFilter(I*p, -1, (r,r))cov_Ip = m_Ip-m_I*m_pm_II = cv2.boxFilter(I*I, -1, (r,r))var_I = m_II-m_I*m_Ia = cov_Ip/(var_I+eps)b = m_p-a*m_Im_a = cv2.boxFilter(a, -1, (r,r))m_b = cv2.boxFilter(b, -1, (r,r))return m_a*I+m_b计算大气遮罩图像V1和光照值A, V1 = 1-t/A
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 = 2000ht = np.histogram(V1, bins)#计算大气光照Ad = np.cumsum(ht[0])/float(V1.size)for lmax in range(bins-1, 0, -1):if d[lmax]<=0.999:breakA= np.mean(m,2)[V1>=ht[1][lmax]].max()V1 = np.minimum(V1*w, maxV1)#对值范围进行限制return V1,A得到的运行程序结果如下:
本文插图
通过调整代码 , 将视频分帧 , 可以达到视频去雾的效果:
其完整代码如下:
import cv2import numpy as npdef zmMinFilterGray(src, r=7):'''最小值滤波 , r是滤波器半径''''''if r <= 0:return srch, w = src.shape[:2]I= srcres = np.minimum(I,I[[0]+range(h-1), :])res = np.minimum(res, I[range(1,h)+[h-1], :])I= resres = 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):'''引导滤波'''height, width = I.shapem_I = cv2.boxFilter(I, -1, (r, r))m_p = cv2.boxFilter(p, -1, (r, r))m_Ip = cv2.boxFilter(I * p, -1, (r, r))cov_Ip = m_Ip - m_I * m_pm_II = cv2.boxFilter(I * I, -1, (r, r))var_I = m_II - m_I * m_Ia= cov_Ip / (var_I + eps)b= m_p - a * m_Im_a = cv2.boxFilter(a, -1, (r, r))m_b = cv2.boxFilter(b, -1, (r, r))return m_a * I + m_bdef 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 = 2000ht = np.histogram(V1, bins)# 计算大气光照Ad= np.cumsum(ht[0]) / float(V1.size)for lmax in range(bins - 1, 0, -1):if d[lmax] <= 0.999:breakA= np.mean(m, 2)[V1 >= ht[1][lmax]].max()V1 = np.minimum(V1 * w, maxV1)# 对值范围进行限制return V1, Adef 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 Yvideo = ''1.mp4''cap = cv2.VideoCapture(video)while cap.isOpened():_,frame = cap.read()frame = cv2.flip(frame, -180)cv2.imwrite(''temp.jpg'',frame)m= deHaze(frame / 255.0) * 255height, width = m.shape[:2]#缩小图像size = (int(width * 0.5), int(height * 0.5))shrink = cv2.resize(m, size, interpolation=cv2.INTER_AREA)cv2.imwrite('defog.jpg', shrink)img = cv2.imread(''defog.jpg'')cv2.imshow(''frame'',img)key = cv2.waitKey(1) & 0xFFif key == ord(''q''):breakcap.release()cv2.destroyAllWindows()作者介绍:李秋键 , CSDN 博客专家 , CSDN达人课作者 。 硕士在读于中国矿业大学 , 开发有taptap安卓武侠游戏一部 , vip视频解析 , 文意转换工具 , 写作机器人等项目 , 发表论文若干 , 多次高数竞赛获奖等等 。
推荐阅读
- 第一财经|8月外储实现五连升,双循环格局将继续支持规模总体稳定
- 【】前8个月我国外贸总值突破20万亿元 出口首次实现年内正增长
- 央视新闻客户端|前8月我国外贸总值突破20万亿 出口首次实现年内正增长
- 人民币|8月外储实现五连升,双循环格局将继续支持规模总体稳定
- 幻化成蝶|2020的手机居然还能烫伤人!
- 一味宠爱|最全盘点卡中国脖子的35项技术,折射中国工业水平的真实现状
- 上海宝山|实现加装电梯“零突破”!,罗店这个小区这样做
- 央视新闻客户端|前8个月我国外贸总值突破20万亿元 出口首次实现年内正增长
- 科内|意大利超级杯结束!科内实现3连冠,诺瓦拉全新阵容令人失望
- 智能垃圾分类小屋亮相服贸会 可实现一站式垃圾分类
