如何在 OpenCV 中锐化图像?

问题描述 投票:0回答:10

如何使用 OpenCV 锐化图像?

有很多平滑或模糊的方法,但我没有看到锐化的方法。

image-processing opencv
10个回答
192
投票

维基百科关于锐化遮罩的文章中列出了一个一般程序:

您使用高斯平滑滤波器并从原始图像中减去平滑版本(以加权方式,以便恒定区域的值保持恒定)。

要将

frame

 的锐化版本转换为 
image
:(都是 
cv::Mat

cv::GaussianBlur(frame, image, cv::Size(0, 0), 3); cv::addWeighted(frame, 1.5, image, -0.5, 0, image);
参数有些东西需要你自己调整。

还有拉普拉斯锐化,当你谷歌时你应该找到一些东西。


73
投票
您可以尝试一个简单的

kernelfilter2D 函数,例如在Python中:

kernel = np.array([[-1,-1,-1], [-1,9,-1], [-1,-1,-1]]) im = cv2.filter2D(im, -1, kernel)

维基百科对内核有很好的概述,这里还有一些更多的例子 -

https://en.wikipedia.org/wiki/Kernel_(image_processing)

在图像处理中,内核、卷积矩阵或掩模是一个小矩阵。它用于模糊、锐化、浮雕、边缘检测等。这是通过在内核和图像之间进行卷积来完成的。


34
投票
您可以使用

不锐化蒙版锐化图像。您可以在此处找到有关锐化遮罩的更多信息。这是使用 OpenCV 的 Python 实现:

import cv2 as cv import numpy as np def unsharp_mask(image, kernel_size=(5, 5), sigma=1.0, amount=1.0, threshold=0): """Return a sharpened version of the image, using an unsharp mask.""" blurred = cv.GaussianBlur(image, kernel_size, sigma) sharpened = float(amount + 1) * image - float(amount) * blurred sharpened = np.maximum(sharpened, np.zeros(sharpened.shape)) sharpened = np.minimum(sharpened, 255 * np.ones(sharpened.shape)) sharpened = sharpened.round().astype(np.uint8) if threshold > 0: low_contrast_mask = np.absolute(image - blurred) < threshold np.copyto(sharpened, image, where=low_contrast_mask) return sharpened def example(): image = cv.imread('my-image.jpg') sharpened_image = unsharp_mask(image) cv.imwrite('my-sharpened-image.jpg', sharpened_image)
    

19
投票
任何图像都是各种频率信号的集合。这 较高频率控制边缘,较低频率控制 图像内容。当有急剧过渡时就会形成边缘 从一个像素值到另一个像素值,例如 0 和 255 相邻的单元格。显然有一个急剧的变化,因此边缘 和高频。为了锐化图像,这些过渡可以是 进一步增强。

一种方法是将自制的滤波器内核与图像进行卷积。

import cv2 import numpy as np image = cv2.imread('images/input.jpg') kernel = np.array([[-1,-1,-1], [-1, 9,-1], [-1,-1,-1]]) sharpened = cv2.filter2D(image, -1, kernel) # applying the sharpening kernel to the input image & displaying it. cv2.imshow('Image Sharpening', sharpened) cv2.waitKey(0) cv2.destroyAllWindows()
还有另一种方法可以从图像的明亮版本中减去图像的模糊版本。这有助于锐化图像。但应该谨慎行事,因为我们只是增加像素值。想象一下灰度像素值 190,如果乘以权重 2,则为 380,但由于最大允许像素范围而被修剪为 255。这是信息丢失并导致图像褪色。

addWeighted(frame, 1.5, image, -0.5, 0, image);
    

17
投票
您可以在

OpenCV文档中找到有关使用“unsharp mask”算法锐化图像的示例代码。

更改

sigma

threshold
amount
 的值会产生不同的结果。

// sharpen image using "unsharp mask" algorithm Mat blurred; double sigma = 1, threshold = 5, amount = 1; GaussianBlur(img, blurred, Size(), sigma, sigma); Mat lowContrastMask = abs(img - blurred) < threshold; Mat sharpened = img*(1+amount) + blurred*(-amount); img.copyTo(sharpened, lowContrastMask);
    

11
投票
为了清楚地说明本主题,确实应该指出几点:

  1. 锐化图像是一个不适定问题。换句话说,模糊是一种有损操作,并且通常不可能返回。

  2. 要锐化单个图像,您需要以某种方式添加约束(假设)来确定您想要什么样的图像以及它如何变得模糊。这是自然图像统计的领域。锐化方法将这些统计数据显式或隐式地保存在其算法中(深度学习是最隐式编码的方法)。对

    DOG或拉普拉斯金字塔分解的某些级别进行加权的常见方法是Brian Burns答案的概括,假设高斯模糊破坏了图像,并且如何进行加权与以下假设有关:图像中一开始是什么。

  3. 其他信息来源可以使问题尖锐化。常见的此类信息源是移动对象的视频或多视图设置。这种设置下的锐化通常被称为“超分辨率”(这是一个非常糟糕的名字,但它一直停留在学术界)。 OpenCV 中已经有

    超分辨率方法很长一段时间了……尽管它们通常不能很好地解决实际问题,上次我检查了它们。我预计深度学习在这里也能产生一些精彩的结果。也许有人会发表评论,评论那里有什么值得的。

您也可以尝试这个过滤器

7
投票
sharpen_filter = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]]) sharped_img = cv2.filter2D(image, -1, sharpen_filter)

要锐化图像,我们可以使用滤镜(如之前的许多答案中所示)

3
投票
kernel = np.array([[-1, -1, -1],[-1, 8, -1],[-1, -1, 0]], np.float32) kernel /= denominator * kernel

分母为1时最大,随着增加而减少(2.3..)
最常用的是分母为3时。

下面是实现。

kernel = np.array([[-1, -1, -1],[-1, 8, -1],[-1, -1, 0]], np.float32) kernel = 1/3 * kernel dst = cv2.filter2D(image, -1, kernel)

将 numpy 导入为 np

0
投票
将 matplotlib.pyplot 导入为 plt

导入CV2

图像 = cv2.imread(r"D: itesh\Dinesh.jpg")

图像 = cv2.cvtColor(图像, cv2.COLOR_BGR2RGB)

plt.figure(figsize=(20, 20))

plt.子图(1,2,1)

plt.title(“原文”)

plt.imshow(图像)

kernel_sharpening = np.array([[-1,-1,-1],

[-1,9,-1], [-1,-1,-1]])

锐化= cv2.filter2D(图像,-1,kernel_sharpening)
plt.子图(1,2,2)

plt.title(“图像锐化”)

plt.imshow(锐化)

plt.show()


enter image description here

尝试一下:

-7
投票
cv::bilateralFilter(img, 9, 75, 75);

您可能会在
此处
找到更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.