Python-OpenCV图像平滑

预备知识:边缘扩充

图像在进行卷积时算子有时会移动到图片的外部,所以预先将图片进行边缘扩充,可以在一定程度上提高图像平滑的效果。

代码示例:

import cv2 as cv

src1 = cv.imread("test.jpg")

# 原始图片
cv.namedWindow('window')
cv.imshow('window', src1)

# 复制-边界扩充
img1 = cv.copyMakeBorder(src1, 50, 50, 50, 50, cv.BORDER_REPLICATE)
cv.imshow('replicate', img1)

# reflect,边界反射扩充
img2 = cv.copyMakeBorder(src1, 50, 50, 50, 50, cv.BORDER_REFLECT)
cv.imshow('reflect', img2)

# consdent,常数扩充
img3 = cv.copyMakeBorder(src1, 50, 50, 50, 50, cv.BORDER_CONSTANT, value=[200, 200, 200])
cv.imshow('constent', img3)

# wrap,平铺扩充
img4 = cv.copyMakeBorder(src1, 50, 50, 50, 50, cv.BORDER_WRAP)
cv.imshow('warp', img4)

cv.waitKey()
cv.destroyAllWindows()

示例圖片:

原始图片
复制扩充
常数扩充
平铺扩充
反射扩充

图像平滑

图像平滑一般主要的目的都是为了实现对图像噪声的消除,增强图像的显示效果。

代码示例:

import cv2 as cv
import numpy as np

# 原始图片
image = cv.imread("test.jpg")
cv.imshow('originalImage', image)
cv.waitKey()

# 1、blur—图像均值平滑滤波
# 函数原型:blur(src, ksize, dst=None, anchor=None, borderType=None)
# src:图像矩阵
# ksize:滤波窗口(算子)尺寸
# anchor:锚点
# borderType:边界扩充类型

# np.hstack():在水平方向上平铺
blurImage1 = np.hstack([cv.blur(image, (3, 3)), cv.blur(image, (5, 5)), cv.blur(image, (7, 7))])
cv.imshow('Averaged', blurImage1)
cv.waitKey()
cv.destroyWindow('Averaged')


# 2、GaussianBlur—图像高斯平滑滤波
# 函数原型:GaussianBlur(src, ksize, sigmaX, dst=None, sigmaY=None, borderType=None)
# src:图像矩阵
# ksize:滤波窗口(卷积核)尺寸
# dst:输出矩阵
# sigmaX:一维水平方向卷积核标准差
# sigmaY:一维竖直方向卷积核标准差
# borderType:边界扩充类型
blurImage2 = np.hstack([cv.GaussianBlur(image, (3, 3), 0), cv.GaussianBlur(image, (5, 5), 0),
                        cv.GaussianBlur(image, (7, 7), 0)])
cv.imshow('Gaussian', blurImage2)
cv.waitKey()
cv.destroyWindow('Gaussian')


# 3、medianBlur—图像中值滤波
# 函数原型:medianBlur(src, ksize, dst=None)
# src:图像矩阵
# ksize:滤波窗口尺寸
# dst:输出矩阵
blurImage3 = np.hstack([cv.medianBlur(image, 3), cv.medianBlur(image, 5), cv.medianBlur(image, 7)])
cv.imshow('Median', blurImage3)
cv.waitKey()
cv.destroyWindow('Median')


# 4、bilateralFilter—图像双边滤波
# 函数原型:bilateralFilter(src, d, sigmaColor, sigmaSpace, dst=None, borderType=None)
# src:图像矩阵
# d:像素邻域直径
# sigmaColor:相似性权重矩阵标准差
# sigmaSpace:空间距离权重标准差
blurImage3 = np.hstack([cv.bilateralFilter(image, 5, 21, 21), cv.bilateralFilter(image, 7, 31, 31),
                        cv.bilateralFilter(image, 9, 41, 41)])
cv.imshow('Bilateral', blurImage3)
cv.waitKey()

cv.destroyAllWindows()
原始图片
均值滤波
高斯滤波
中值滤波
test
双边滤波

猜你喜欢

转载自blog.csdn.net/li_l_il/article/details/83190362