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
    评论
### 回答1: Python中有几种常用的方法可以使用OpenCV来压缩图片。 1. 调整图片质量:可以使用cv2.IMWRITE_JPEG_QUALITY参数来调整JPEG格式图片的压缩质量。该参数的范围是0(最低质量)到100(最高质量)。默认值是95。你可以根据你的需求将该值设置为合适的数值。较低的数值会减小图片文件的大小,但会引入一定程度的失真。例如,可以使用以下代码将图片压缩到指定质量: ```python import cv2 image = cv2.imread("image.jpg") cv2.imwrite("compressed_image.jpg", image, [cv2.IMWRITE_JPEG_QUALITY, 70]) ``` 2. 调整图片大小:另一种常见的压缩图片的方法是调整图片的大小。可以使用cv2.resize()函数来调整图片的尺寸。通过改变图片的宽度和高度,可以减小图片文件的大小。以下代码将调整图片的宽度和高度: ```python import cv2 image = cv2.imread("image.jpg") resized_image = cv2.resize(image, (800, 600)) cv2.imwrite("compressed_image.jpg", resized_image) ``` 3. 采用图像编码算法OpenCV还支持其他图像编码算法来压缩图片,如PNG编码算法和WEBP编码算法。通过设置不同的编码标志,可以选择使用不同的算法进行图片压缩。例如,通过设置cv2.IMWRITE_PNG_COMPRESSION参数为3,可以使用PNG编码算法压缩图片: ```python import cv2 image = cv2.imread("image.jpg") cv2.imwrite("compressed_image.png", image, [cv2.IMWRITE_PNG_COMPRESSION, 3]) ``` 总之,Python中的OpenCV库提供了多种方法来对图片进行压缩。你可以根据实际需求选择合适的方法。 ### 回答2: Python中的OpenCV库提供了多种压缩图片算法。其中一个常用的方法是使用cv2.imwrite()函数保存图像时,使用不同的参数来调整图像的压缩比例。该函数的参数之一是保存质量,可以设置为0-100的整数值。较高的值表示更高的质量和较小的压缩比例,较低的值表示低质量和较高的压缩比例。 另一种压缩算法是使用cv2.imencode()函数,将图像编码为特定格式(如JPEG或PNG),然后将编码后的图像数据保存到内存中。这个方法允许我们更精确地控制压缩参数,如压缩比、色彩空间和格式。 下面是一个示例代码,演示了如何使用cv2.imencode()函数来压缩图像: ``` import cv2 import numpy as np def compress_image(image_path, output_path, quality=50): # 读取图像 image = cv2.imread(image_path) # 选择压缩参数 encode_param = [cv2.IMWRITE_JPEG_QUALITY, quality] # 压缩图像 _, compressed_image = cv2.imencode('.jpg', image, encode_param) # 将压缩后的图像保存到文件 with open(output_path, 'wb') as file: file.write(np.array(compressed_image)) # 调用函数进行压缩 compress_image('input.jpg', 'output.jpg', quality=50) ``` 上述代码将图像从文件中读取,并使用JPEG格式进行压缩。压缩后的图像数据保存在内存中,并最后写入到输出文件中。可以通过调整quality参数来控制压缩质量。 总之,Python中的OpenCV库提供了多种压缩图像的方法,开发者可以根据实际需要选择合适的方法和参数进行压缩。 ### 回答3: Python OpenCV提供了多种图像压缩算法,旨在减少图像文件的大小。下面是几种常用的算法: 1. JPEG压缩算法: JPEG是一种有损压缩算法,可以通过调整压缩参数来平衡图像质量和压缩比。在OpenCV中,可以通过指定`cv2.IMWRITE_JPEG_QUALITY`参数来控制压缩质量,范围为0到100,值越高表示质量越好,文件大小越大。 ```python cv2.imwrite("compressed.jpg", image, [cv2.IMWRITE_JPEG_QUALITY, 90]) ``` 2. PNG压缩算法: PNG是一种无损压缩算法,可以保留图像的完整质量,但通常会生成较大的文件。在OpenCV中,可以通过指定`cv2.IMWRITE_PNG_COMPRESSION`参数来控制压缩级别,范围为0到9,值越高表示压缩越强,生成的文件越小。 ```python cv2.imwrite("compressed.png", image, [cv2.IMWRITE_PNG_COMPRESSION, 5]) ``` 3. WEBP压缩算法: WEBP是一种现代化的图像压缩格式,结合了有损和无损的压缩算法。在OpenCV中,可以通过指定`cv2.IMWRITE_WEBP_QUALITY`参数来控制有损压缩的质量,范围为0到100,值越高表示质量越好,文件大小越大。 ```python cv2.imwrite("compressed.webp", image, [cv2.IMWRITE_WEBP_QUALITY, 80]) ``` 通过选择适当的压缩算法和参数,可以在图像文件大小和质量之间进行权衡,以满足具体的需求。需要注意的是,图像压缩往往会引入一定程度的信息损失,因此需要根据具体应用场景进行选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

DLANDML

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

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

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

打赏作者

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

抵扣说明:

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

余额充值