图像还原以增强OpenCV的细节

时间:2019-06-28 19:50:04

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

我正在尝试恢复和增强多张照片的图像细节。我尝试通过增加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 ++

输入图像

enter image description here

当前结果 enter image description here

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)

4 个答案:

答案 0 :(得分:3)

您可以尝试应用保留边缘的高斯滤波代替interface AuthRouteProps extends RouteProps { component: any; } const AuthRoute = (props: AuthRouteProps) => { const {component: Component, ...rest} = props; return ( <Route {...rest} render={(routeProps) => ( <div> ... // here is the auth header <Component {...routeProps} /> .. // here is the auth footer </div> ) } /> ); }; export default AuthRoute;

例如,您可以尝试bilateral filterguided filter

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

下面的MATLAB代码演示了过滤器:

GaussianBlur

引导式过滤器:
Guided filter

双边过滤器:
enter image description here

答案 1 :(得分: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])

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

enter image description here


在某些情况下,整个区域的强度变化很大,CLAHE(对比度受限的自适应直方图均衡)可能会更好。 CLAHE在OpenCV中以cv2.createCLAHE()

的形式实现

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

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

enter image description here

这是两种方法之间的可视化 enter image description here

答案 2 :(得分:3)

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

输入:

enter image description here

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


enter image description here

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

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

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


enter image description here

说明:

SPACE2是一种自适应技术,可以增强图像的亮度和对比度。 SPACE是SPacially Adaptive Contrast Enhancement的缩写。

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

答案 3 :(得分:2)

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

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)