【问题标题】:Image restoration to enhance details with OpenCV使用 OpenCV 恢复图像以增强细节
【发布时间】:2019-11-10 17:49:43
【问题描述】:

我正在尝试恢复和增强多张照片的图像细节。我试图通过增加cv2.filter2D()simple kernels 的清晰度来显示细节。

我已经尝试过边缘检测内核

[-1 -1 -1]
[-1  9 -1]
[-1 -1 -1]

还有一个锐化的内核

[ 0 -1  0]
[-1  5 -1]
[ 0 -1  0]

但结果看起来颗粒状且不自然。为了消除噪音,我尝试了cv2.medianBlur()cv2.GaussianBlur() 等模糊技术,但效果并不理想。图像背景模糊或较暗,这使得特征难以区分。有没有更好的方法来显示更多细节,尤其是在背景中?对 Python 或 C++ 开放

输入图像

当前结果

import numpy as np
import cv2

img = cv2.imread('people.jpg')
grayscale = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# edge_kernel = np.array([[-1,-1,-1], [-1,9,-1], [-1,-1,-1]])
sharpen_kernel = np.array([[0,-1,0], [-1,5,-1], [0,-1,0]])
img = cv2.filter2D(grayscale, -1, sharpen_kernel)

# Smooth out image
# blur = cv2.medianBlur(img, 3)
blur = cv2.GaussianBlur(img, (3,3), 0)

cv2.imshow('img',img)
cv2.imwrite('img.png',img)
cv2.imshow('blur',blur)
cv2.waitKey(0)

【问题讨论】:

标签: python c++ opencv image-processing computer-vision


【解决方案1】:

您可以使过滤器变弱,例如

sharpen_kernel = np.array([[0,-.5,0], [-.5,3,-.5], [0,-.5,0]])

或者可以尝试不锐化蒙版

gaussian_3 = cv2.GaussianBlur(grayscale, (9,9), 10.0)
img = cv2.addWeighted(img, 1.5, gaussian_3, -0.5, 0, img)

【讨论】:

  • 您的“较弱”过滤器会导致图像非常暗,因为权重加起来不等于 1。将 -1s 更改为 -0.5,它应该是平衡的。
  • 您也更改了中心值。权重加起来仍然不等于 1。考虑一个完全不执行任何操作的过滤器看起来像 [[0,0,0],[0,1,0],[0,0,0]]。
【解决方案2】:

您可以尝试应用保边高斯滤波来代替GaussianBlur

比如你可以试试bilateral filter或者guided filter

有 OpenCV 实现,但我从未尝试过。

以下 MATLAB 代码演示了过滤器:

I = rgb2gray(im2double(imread('I.jpg')));

G = imguidedfilter(I, 'DegreeOfSmoothing', 0.005);
J = imsharpen(G, 'Amount', 2);

figure;imshow(J)

B = imbilatfilt(I);
K = imsharpen(B, 'Amount', 2);
figure;imshow(K)

引导过滤器:

双边过滤器:

【讨论】:

    【解决方案3】:

    Histogram equalization 可以在这里通过扩展强度范围来提高灰度图像的对比度。这是输入图像的直方图的可视化

    from matplotlib import pyplot as plt
    import cv2
    
    # Load in image as grayscale
    image = cv2.imread('1.jpg', 0)
    
    plt.hist(image.ravel(), 256, [0,256])
    

    像素聚集在中等强度附近。为了增加图像的对比度,直方图均衡化在整个范围内拉伸强度值以获得更宽和更均匀的分布。你可以使用内置函数cv2.equalizeHist()

    equalize = cv2.equalizeHist(image)
    plt.hist(equalize.ravel(), 256, [0,256])
    

    强度范围现在均匀分布。直方图均衡考虑了图像的全局对比度,当图像的直方图被限制在特定区域时效果很好。这是结果


    在某些情况下,如果大区域存在强度变化,则 CLAHE(对比度受限自适应直方图均衡)可能会更好。 CLAHE 在 OpenCV 中实现为 cv2.createCLAHE()

    clahe = cv2.createCLAHE().apply(image)
    plt.hist(clahe.ravel(), 256, [0,256])
    

    此变体在执行自适应直方图均衡之前将像素划分为小块。

    这是两种方法之间的可视化

    【讨论】:

    • CLAHE 需要一个更大的窗口来避免很多黑暗和明亮的光晕
    【解决方案4】:

    只是为了比较,我有一个 ImageMagick 脚本,它可以进行空间自适应对比度增强(称为空间)。见http://www.fmwconcepts.com/imagemagick

    输入:

    space -c 2 -w 20 img.jpg result.png
    


    更多细节,但有点颗粒感。

    这是我的变体 space2 的结果,这可能会让你更满意。

    space2 -w 5 -m 10 img.jpg result_space2_w5_m10.jpg
    


    解释:

    SPACE2 是一种增强图像亮度和对比度的自适应技术。 SPACE 是空间自适应对比度增强的缩写。

    自适应公式 R = M + G*(I-M)。这里 R 是生成的图像。我是输入图像。 M 是平均图像,它是输入图像的低通滤波版本。它是通过将输入图像的块大小调整为输入大小的一部分来生成的。调整大小量是根据窗口大小计算的。然后将该图像重新扩展为其原始大小。调整大小技术是应用大块大小移动窗口平均值的快速方法。术语 (I-M) 是输入图像的高通滤波版本。 G 是一个增益图像,它涉及 S,即输入图像的标准偏差,由与用于创建平均图像 M 相同的大小调整技术生成。G 还包括所需的标准偏差 (dstd) 和最大增益因子。增益图像 G 用于设置输出中的细节量(锐度)以及限制失控增益。最大增益通常约为 1-10,默认值为 2.5。块窗口大小通常约为图像大小的 5-20%,名义上为 8%。有时,人们可能希望将最大增益值推到高于默认值,例如,当试图从模糊图片中提取信息时。该算法具有控制亮度、对比度和饱和度的选项。亮度和对比度已自动计算出取决于图像的默认值。它们通过 sigmoidal 非线性函数应用。饱和度是 LAB 色彩空间中的线性调整,默认不变。

    【讨论】:

    • 看起来这是目前去除图像顶部雾霾的最佳方法。也许在您的答案中包含对脚本的描述。另外,你能做些什么来恢复原作中某些物体的深度和黑暗?
    • 使用我的变体脚本 space2 查看我的附加答案。
    猜你喜欢
    • 2014-04-20
    • 2018-04-14
    • 1970-01-01
    • 2014-05-09
    • 1970-01-01
    • 1970-01-01
    • 2013-10-07
    • 1970-01-01
    • 2021-12-18
    相关资源
    最近更新 更多