【计算机视觉1】图像锐化算法

锐化算法

在实际的图像处理中,锐化算法是图像增强中一种普遍的算法,它可以让图像显示效果更加清晰、鲜明。锐化算法的基本思想是对图像进行高通滤波来增强图像的高频部分,然后将增强后的高频部分加回到原图像中,从而得到锐化后的图像。

拉普拉斯公式

其中一个常用的锐化算法是“拉普拉斯公式”。

  • f(x,y) = g(x,y) - k * (g(x+1,y) + g(x-1,y) + g(x,y+1) + g(x,y-1))

其中,f(x,y)为锐化后的像素值,g(x,y)为原始像素值,k为一个常数,通常取值范围为0.2~0.8,以实现不同程度的锐化效果。对于边缘处的像素,需要进行特殊处理。

Python实现

# 定义锐化算子
kernel = np.array([[0,-1,0],[-1,5,-1],[0,-1,0]])

# 使用滤波器进行卷积操作
dst = cv2.filter2D(img, -1, kernel)

cv2.filter2D函数进行锐化操作,其中第一个参数为原始图像,第二个参数为输出图像的深度,通常设置为-1表示与原始图像相同。第三个参数为卷积核,这里使用的是拉普拉斯算子。

C++实现

Mat sharpening(Mat inputImage)
{
    
    
    // 定义拉普拉斯算子模板
    Mat laplacianKernel = (Mat_<float>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
    Mat outputImage;
    // 使用滤波函数对输入图像进行锐化处理
    filter2D(inputImage, outputImage, inputImage.depth(), laplacianKernel);
    return outputImage;
}

在函数中,我们先定义了拉普拉斯算子模板,然后对输入图像进行滤波操作,最终返回锐化后的图像。

高斯公式

锐化算法中使用的高斯模糊滤波器可以由以下公式表示:

  • G(x,y) = 1/(2πσ²)e^(-(x²+y²)/(2σ²))

其中,x、y为像素位置,σ为高斯核的标准差。

在锐化算法中,我们需要将原始图像减去模糊图像,得到图像的高频成分,即边缘信息,可以使用以下公式:

  • I’(x,y) = I(x,y) - k * G(x,y) * I(x,y)

其中,I(x,y)为原始图像,G(x,y)为高斯模糊滤波器,k为增强系数。

Python实现

# 定义锐化系数
alpha = 1.5

# 定义高斯核大小和标准差
kernel_size = 5
sigma = 1.5

# 构建高斯核
kernel = cv2.getGaussianKernel(kernel_size, sigma)

# 对高斯核进行归一化
kernel = (kernel / np.sum(kernel))[:, np.newaxis]

# 读取原始图像
img = cv2.imread('input.jpg')

# 对图像进行高斯滤波
blur = cv2.filter2D(img, -1, kernel)

# 计算锐化后的图像
sharp = cv2.addWeighted(img, alpha, blur, -alpha, 0)

cv2.getGaussianKernel函数用于构建高斯核,cv2.filter2D函数用于对图像进行高斯滤波,cv2.addWeighted函数用于计算锐化后的图像,其之间的区别就在于卷积核不同。

C++实现

void sharpenImage(Mat& input, Mat& output, float sigma, float amount)
 {
    
    
    // 创建高斯核
    int kernelSize = 2 * int(4 * sigma + 0.5) + 1;
    Mat kernel = getGaussianKernel(kernelSize, sigma, CV_32F);
    // 创建拉普拉斯核
    Mat laplacianKernel = (Mat_<float>(3, 3) << 0, -1, 0, -1, 4, -1, 0, -1, 0);
    // 对高斯核进行归一化
    kernel /= sum(kernel)[0];
    // 进行卷积,得到中间图像
    Mat middle;
    filter2D(input, middle, -1, kernel);
    // 对中间图像进行锐化处理
    Mat laplacian;
    filter2D(middle, laplacian, -1, laplacianKernel);
    output = input + amount * laplacian;
}

其中,input为原始图像,sigma为高斯核标准差,amount为锐化强度,output为锐化后的图像。该函数首先创建一个高斯核,然后创建一个拉普拉斯核,对高斯核进行归一化并进行卷积得到中间图像,最后对中间图像进行锐化处理得到最终的锐化图像。

猜你喜欢

转载自blog.csdn.net/weixin_43504942/article/details/130837217
今日推荐