python opencv视频除雾算法


#https://www.pianshen.com/article/949473269/
#author:ljj
#time:2021/7
import cv2
import math
import numpy as np

class RmvFog: #remove fog from video

    def __init__(self):
        None

    def DarkChannel(self,im, sz):
        b, g, r = cv2.split(im)
        dc = cv2.min(cv2.min(r, g), b);
        kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (sz, sz))
        dark = cv2.erode(dc, kernel)
        return dark


    def AtmLight(self,im, dark):
        [h, w] = im.shape[:2]
        imsz = h * w
        numpx = int(max(math.floor(imsz / 1000), 1))
        darkvec = dark.reshape(imsz, 1);
        imvec = im.reshape(imsz, 3);

        indices = darkvec.argsort();
        indices = indices[imsz - numpx::]

        atmsum = np.zeros([1, 3])
        for ind in range(1, numpx):
            atmsum = atmsum + imvec[indices[ind]]

        A = atmsum / numpx;
        return A


    def TransmissionEstimate(self,im, A, sz):
        omega = 0.95;
        im3 = np.empty(im.shape, im.dtype);

        for ind in range(0, 3):
            im3[:, :, ind] = im[:, :, ind] / A[0, ind]

        transmission = 1 - omega * self.DarkChannel(im3, sz);
        return transmission


    def Guidedfilter(self,im, p, r, eps):
        mean_I = cv2.boxFilter(im, cv2.CV_64F, (r, r));
        mean_p = cv2.boxFilter(p, cv2.CV_64F, (r, r));
        mean_Ip = cv2.boxFilter(im * p, cv2.CV_64F, (r, r));
        cov_Ip = mean_Ip - mean_I * mean_p;

        mean_II = cv2.boxFilter(im * im, cv2.CV_64F, (r, r));
        var_I = mean_II - mean_I * mean_I;

        a = cov_Ip / (var_I + eps);
        b = mean_p - a * mean_I;

        mean_a = cv2.boxFilter(a, cv2.CV_64F, (r, r));
        mean_b = cv2.boxFilter(b, cv2.CV_64F, (r, r));

        q = mean_a * im + mean_b;
        return q;


    def TransmissionRefine(self,im, et):
        gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY);
        gray = np.float64(gray) / 255;
        r = 60;
        eps = 0.0001;
        t = self.Guidedfilter(gray, et, r, eps);

        return t;


    def Recover(self,im, t, A, tx=0.1):
        res = np.empty(im.shape, im.dtype);
        t = cv2.max(t, tx);

        for ind in range(0, 3):
            res[:, :, ind] = (im[:, :, ind] - A[0, ind]) / t + A[0, ind]

        return res
    def RemoveSmoke(self,img):
        # src = cv2.imread(img);
        src=img
        I = src.astype('float64') / 255;
        dark = self.DarkChannel(I, 15);
        A = self.AtmLight(I, dark);
        te = self.TransmissionEstimate(I, A, 15);
        t = self.TransmissionRefine(src, te);
        J = self.Recover(I, t, A, 0.1);
        arr = np.hstack((I, J))
        return arr


if __name__ == '__main__':
    import sys

    try:
        fn = sys.argv[1]
    except:
        fn = 'test.png'


    def nothing(*argv):
        pass


    a=RmvFog()
    src = cv2.imread(fn);
    I = src.astype('float64') / 255;
    dark = a.DarkChannel(I, 15);
    A = a.AtmLight(I, dark);
    te = a.TransmissionEstimate(I, A, 15);
    t = a.TransmissionRefine(src, te);
    J = a.Recover(I, t, A, 0.1);
    arr = np.hstack((I, J))
    cv2.imshow("contrast", arr)
    cv2.imwrite("dehaze.png", J * 255)
    cv2.imwrite("contrast.png", arr * 255);
    cv2.waitKey();

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DLANDML

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值