如何在OpenCV中锐化图像?

时间:2011-02-14 14:07:26

标签: image-processing opencv

如何使用 OpenCV 锐化图像?有许多平滑或模糊的方法,但没有我能看到的锐化。

9 个答案:

答案 0 :(得分:148)

the wikipedia article on unsharp masking中列出了一个通用程序: 您使用高斯平滑滤波器并从原始图像中减去平滑后的版本(以加权方式,以便恒定区域的值保持不变)。

要将frame的锐化版本纳入image :( cv::Mat}

cv::GaussianBlur(frame, image, cv::Size(0, 0), 3);
cv::addWeighted(frame, 1.5, image, -0.5, 0, image);

您需要为自己调整参数。

还有laplacian锐化,你应该在谷歌上找到一些东西。

答案 1 :(得分:30)

您可以尝试使用简单的内核 filter2D 功能,例如在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)

  

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

答案 2 :(得分:13)

您可以在OpenCV Documentation找到关于使用“不清晰遮罩”算法锐化图像的示例代码。

更改video-modalFile listOfFiles = new File ("\\\\server\\share\\TEST\\file.xml"); if (listOfFiles.exists() && listOfFiles.isFile()){ // ... } curl https://sdk.cloud.google.com | bash 的值会产生不同的结果。

WARNING: Component [app] no longer exists.

All components are up to date.

答案 3 :(得分:2)

为清楚起见,实际上应该指出几点:

  1. 锐化图像是一个不适的问题。换句话说,模糊是一种有损操作,因此通常无法进行模糊处理。

  2. 要锐化单个图像,您需要以某种方式添加对所需图像种类以及图像变得模糊的限制(假设)。这是自然图像统计的领域。进行锐化的方法将这些统计信息显式或隐式地保存在其算法中(深度学习是最隐式编码的算法)。对DOG or Laplacian pyramid decomposition的某些级别进行加权的常见方法是布莱恩·伯恩斯(Brian Burns)的回答,它假定高斯模糊会破坏图像,并且加权的完成方式与对首先是图片

  3. 其他信息来源可能使问题变得更加突出。此类信息的常见来源是运动对象的视频或多视图设置。在这种情况下锐化通常被称为super-resolution(这是一个很不好的名字,但是它一直停留在学术界)。 super-resolution methods in OpenCV已经存在很长时间了。。。尽管它们通常不能很好地解决实际问题,但最后我还是检查了一下。我希望深度学习在这里也能产生出色的结果。也许有人会在上面发表一些值得评论的内容。

答案 4 :(得分:2)

  

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

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

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);

答案 5 :(得分:1)

您可以使用unsharp mask来锐化图像。您可以找到有关锐化遮罩here的更多信息。这是使用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)

答案 6 :(得分:0)

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

kernel = np.array([[-1, -1, -1],[-1, 8, -1],[-1, -1, 0]], np.float32) 

kernel/=denominator*kernel

it will the most when the denominator is 1 and will decrease as increased(2.3..)

the most used one is when the denominator is 3.

下面是实现。

内核= np.array([[-1,-1,-1],[-1,8,-1],[-1,-1,0]],np.float32)

内核= 1/3 *内核

dst = cv2.filter2D(image,-1,kernel)

答案 7 :(得分:0)

您也可以尝试使用此过滤器

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

答案 8 :(得分:-4)

试试这个:

cv::bilateralFilter(img,9,75,75);

您可以找到更多信息here