图像锐化算法

您所在的位置:网站首页 matlab和opencv做图像处理 图像锐化算法

图像锐化算法

2024-01-17 22:37| 来源: 网络整理| 查看: 265

图像锐化,是使图像边缘更清晰的一种图像处理方法,细节增强(detail enhancement)我理解也包含了图像锐化,常用的做法是提取图像的高频分量,将其叠加到原图上。图像高频分量的提取有两种做法,一种是用高通滤波器,得到高频分量,另一种是通过低通滤波,用原图减低频得以高频。

直接提取高频的方法有sobel算法、laplcian算子,sobel算子是图像的一阶导数,提取的是梯度信息,分水平和垂直两种,常常用来做边缘检测、方向判别,sobel算子在斜坡处不为0,因此会产生较粗的边缘。laplcian算子是图像的二阶导,在图像开始变化和结束变化的地方值不为0,渐变时结果为0,因此laplacian比sobel算子更适合做sharpen。 除了直接提取高频的方法外,我们也可以先提取低频,原图减去低频得到高频。这种方法称为非锐化掩模(unsharpen mask),我们常使用低通滤波器(高斯、双边)对图像进行滤波,这种方法滤波器很好控制(包括大小和强弱),从而可以控制高频分量的强弱。

使用UM方向做sharpen时,常常加入另外三个参数:跟滤波器相关的参数(高斯滤波器的半径和方差)、增强的阀值threshold、strength。

下面给出UM方法的三种实现:matlab、C和opencv。

Matlab: Matlab提供了库函数imsharpen,该函数使用UM方法进行sharpen,low-pass filter为gaussian kernel。下面是我实现的UM代码。先将rgb转到ycbcr color space,对Y做sharpen,cb/cr不做处理(最好是使用Y的结果做补偿,这样偏色少),最后再进行ycbcr2rgb的转换。

clc; clear; close all; imSrc = imread('D:\simuTest\picSimu\00_kodak_dataset\kodim05.png'); imSrcYcbcr = rgb2ycbcr(imSrc); imSrcY = imSrcYcbcr(:,:,1); [hei, wid] = size(imSrc(:,:,1)); size = 3; sigma = 1; %gauss standard deviation sigma, default is 1 amount = 1.5; threshold = 15; gaussFilter = fspecial('gaussian', [size, size], sigma); imSrcY_lf = imfilter(imSrcY, gaussFilter, 'symmetric'); imSrcY_hf = imSrcY - imSrcY_lf; imLabel = (imSrcY_hf > threshold); imLabel = uint8(imLabel); imDstY = uint8(imSrcY + amount * imSrcY_hf .* imLabel); figure, imshow([imSrcY, imSrcY_lf, imSrcY_hf, imDstY]); imSrcYcbcr(:,:,1) = imDstY; imDst = ycbcr2rgb(uint8(imSrcYcbcr)); figure, imshow([imSrc, imDst]);

输入输出图像如下所示,左边为sharpen前图像,右边为sharpen后图像。 这里写图片描述

C代码: C有着matlab无法比拟的速度优势。下面是我用C写的UM代码,Srcp为输入源图像,dstp为输出的锐化后的图像,sharpen_coef为定点化后的增强系数(0-64),threshold为增强的阀值(高频分量大于该阈值,才做增强,典型值为15),低通滤波器模板为{{1,2,1},{2,4,2},{1,2,1}}的高斯核。

void imageSharpenUM(uint8_t* srcp, uint8_t* dstp, int src_width, int src_height, int src_pitch, int sharpen_coef, int threshold) { //int gaussianMat[3][3] = {{6, 43, 6}, {43, 317, 43}, {6, 43, 6}}; int gaussianMat[3][3] = {{1, 2, 1}, {2, 4, 2}, {1, 2, 1}}; // 定义低通滤波器 int dstBlur; // 低频图像 int dstTexture; // 细节图像 int dstDetail; // 细节加权重 int src11 = 0; // 11 int src12 = 0; // 12 int src13 = 0; // 13 int src21 = 0; // 21 int src22 = 0; // 22 int src23 = 0; // 23 int src31 = 0; // 31 int src32 = 0; // 32 int src33 = 0; // 33 for(int ver = 0; ver < src_height; ++ver){ for(int hor = 0; hor < src_width; ++hor){ if(ver==0 || ver==(src_height-1) || hor==0 || hor==(src_width-1)){ dstp[ver * src_pitch + hor] = srcp[ver * src_pitch + hor]; } else { src11 = (int)srcp[(ver - 1) * src_pitch + hor - 1] * gaussianMat[0][0]; src12 = (int)srcp[(ver - 1) * src_pitch + hor] * gaussianMat[0][1]; src13 = (int)srcp[(ver - 1) * src_pitch + hor + 1] * gaussianMat[0][2]; src21 = (int)srcp[ver * src_pitch + hor - 1] * gaussianMat[1][0]; src22 = (int)srcp[ver * src_pitch + hor] * gaussianMat[1][1]; src23 = (int)srcp[ver * src_pitch + hor + 1] * gaussianMat[1][2]; src31 = (int)srcp[(ver + 1) * src_pitch + hor - 1] * gaussianMat[2][0]; src32 = (int)srcp[(ver + 1) * src_pitch + hor] * gaussianMat[2][1]; src33 = (int)srcp[(ver + 1) * src_pitch + hor + 1] * gaussianMat[2][2]; dstBlur = (src11 + src12 + src13 + src21 + src22 + src23 + src31 + src32 + src33) >> 4; dstTexture = clip3(srcp[ver * src_pitch + hor] - dstBlur, 0, 255); if(dstTexture > threshold) { dstDetail = (dstTexture * sharpen_coef) >> 4; dstp[ver * src_pitch + hor] = clip3((int)srcp[ver * src_pitch + hor] + dstDetail, 0, 255); } else { dstp[ver * src_pitch + hor] = srcp[ver * src_pitch + hor]; } } } } }

使用下面函数来调用sharpenUM,输入输出图像如下所示,上图是输入图像,下图是锐化后的输出图像。

imDst = sharpenUM(imSrc, 15, 2);

这里写图片描述 这里写图片描述

硬件实现时往往使用LUT来做,根据不同的strength及threshold、偏好设计好LUT,使用高频图像进行查表,将查表的结果叠加到原图上。

参考: [1] matlab -imsharpen [2] 数字图像处理,岗萨雷斯



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3