八:OpenCV图像平滑处理二(C++/python)

在实际业务中经常会需要对图片做平滑处理,如模糊,锐化等方便获取到更多图片特征信息,上一章节已经介绍了5种本函数,本章节继续介绍其他实现函数使用:
1.filter2D
2.fastNlMeansDenoising
3.fastNlMeansDenoisingColored

1.函数 filter2D (图像卷积滤波)

定义:

void filter2D( InputArray src, OutputArray dst, int ddepth,InputArray kernel, Point anchor = Point(-1,-1),double delta = 0, int borderType = BORDER_DEFAULT );

def filter2D(src, ddepth, kernel, dst=None, anchor=None, delta=None, borderType=None)

参数:

src:输入图像
dst:输出图像
kernel:卷积核,不同的卷积核将会得到不同的处理结果
anchor:滤波器的中心,通常采用默认值
delta: 添加到滤波结果的偏移值
borderType:边界类型,通常采用默认值

作用:

卷积滤波,通常通过设置调整不同的卷积核来得到不同的图片处理效果,如体现边界,锐化图片等效果

使用案例

#python code
img=cv2.imread("xxx.jpg")
k=np.array([[0,1.5,0],
            [1.5,-9,1.5],
            [0,1.5,0]])
filter2D=cv2.filter2D(img,-1,k)
merge = np.hstack((img, filter2D))
plt.figure("filter2D")
plt.title("filter2D")
plt.imshow(merge)
plt.show()

#C++ code
#include 
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
    Mat src = imread("xxx.jpg", 1);
    Mat dst;
    Mat kernal = Mat::ones(3, 3, CV_32FC1);
    kernal /= 9;
    filter2D(src, dst,src.depth(), kernal);
    namedWindow("src", 0);
    imshow("src", src);
    namedWindow("dst", 0);
    imshow("dst", dst);
    waitKey(0);
    return 0;
}

效果图

(突出轮廓边框)

(锐化)

其他效果可以通过尝试修改滤波器的值和大小来实现,如不同风格的图片浮雕等。

2.函数 fastNlMeansDenoising (灰度图非局部均值去燥)

定义:

void fastNlMeansDenoising( InputArray src, OutputArray dst, float h = 3,int templateWindowSize = 7, int searchWindowSize = 21);

def fastNlMeansDenoising(src, dst=None, h=None, templateWindowSize=None, searchWindowSize=None)

参数:

src:输入图像
dst:输出图像
h: 调节过滤强度的参数。大的h值完美地去除了噪音,但也去除图像细节,较小的h值保留细节但也保留一些噪声
templateWindowSize: 用于计算权重的模板大小,应该是奇数
searchWindowSize: 用于计算给定像素的加权平均值。应该是奇数。更大的值需要更多的去噪时间。

作用:

灰度图非局部均值去燥,在小噪点较多时去除效果非常不错

使用案例

#python code
img=cv2.imread("xxx.jpg")
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret, warp_binary = cv2.threshold(gray, 180, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
warp_binary=cv2.fastNlMeansDenoising(warp_binary,None,h=40,templateWindowSize=7,searchWindowSize=21)
plt.figure("warp_binary")
plt.title("warp_binary")
plt.imshow(warp_binary)
plt.show()

#C++ code
#include 
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
    Mat src = imread('xxx.jpg", 1);
    Mat dst;
    fastNlMeansDenoising(src,dst,3.0,7,21);
    namedWindow("src", 0);
    imshow("src", src);
    namedWindow("dst", 0);
    imshow("dst", dst);
    waitKey(0);
    return 0;
}

效果图

3.函数 fastNlMeansDenoisingColored (彩色图非局部均值去燥)

定义:

void fastNlMeansDenoisingColored( InputArray src, OutputArray dst, float h = 3, float hColor = 3,int templateWindowSize = 7, int searchWindowSize = 21);

def fastNlMeansDenoisingColored(src, dst=None, h=None, hColor=None, templateWindowSize=None, searchWindowSize=None)

参数:

src:输入三通道图像
dst:输出图像
h: 调节过滤强度的参数。大的h值完美地去除了噪音,但也去除图像细节,较小的h值保留细节但也保留一些噪声
hColor:参数 hColor 与 h 相同,但用于颜色分量。 对于大多数图像值等于10足以消除有色噪声并且不会改变颜色
templateWindowSize: 用于计算权重的模板大小,应该是奇数
searchWindowSize: 用于计算给定像素的加权平均值。应该是奇数。更大的值需要更多的去噪时间。

作用:

彩色图非局部均值去燥,与fastNlMeansDenoising不同的是可以直接输入三通道彩色图片直接去噪声

使用案例

#python code
img=cv2.imread("xxx.jpg")
change=cv2.fastNlMeansDenoisingColored(img,None,h=40,templateWindowSize=7,searchWindowSize=21)
merge = np.hstack((img, change))
plt.figure("merge")
plt.title("merge")
plt.imshow(merge)
plt.show()

#C++ code
#include 
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
    Mat src = imread("xxx.jog", 1);
    Mat dst;
    fastNlMeansDenoisingColored(src, dst, 15, 10, 7, 21);
    namedWindow("src", 0);
    imshow("src", src);
    namedWindow("dst", 0);
    imshow("dst", dst);
    waitKey(0);
    return 0;
}

效果图

根据效果图可以看错,在一些场景下直接通过彩色去噪效果其实没那么好,还是需要分离通道去除噪点,在使用mask蒙版进行磨皮操作能取得较好的效果。

更多文章推荐>>
七:OpenCV图像平滑处理一(C++/python)
六:OpenCV图像变换与增强二(C++/python)