作者:RayChiu_Labloy
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处
线性、非线性各种滤波器原理请看另外一篇文章:
opencv-python 详解线性和非线性滤波、模糊、卷积原理_RayChiu757374816的博客-CSDN博客
测试图片 :
实现代码:
import cv2
import numpy as np
from PIL import Image, ImageDraw, ImageFont
__author__ = "raychiu"
# 均值滤波
def blur(source):
img = cv2.blur(source, (10, 10))
cv2img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # cv2和PIL中颜色的hex码的储存顺序不同
pilimg = Image.fromarray(cv2img)
draw = ImageDraw.Draw(pilimg) # 图片上打印
font = ImageFont.truetype("simhei.ttf", 20, encoding="utf-8") # 参数1:字体文件路径,参数2:字体大小
draw.text((0, 0), "均值滤波", (255, 0, 0), font=font) # 参数1:打印坐标,参数2:文本,参数3:字体颜色,参数4:字体
# PIL图片转cv2 图片
cv2charimg = cv2.cvtColor(np.array(pilimg), cv2.COLOR_RGB2BGR)
cv2.imshow("blur", cv2charimg)
# 中值滤波
def medianBlur(source):
img = cv2.medianBlur(source, 3)
cv2img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # cv2和PIL中颜色的hex码的储存顺序不同
pilimg = Image.fromarray(cv2img)
draw = ImageDraw.Draw(pilimg) # 图片上打印
font = ImageFont.truetype("simhei.ttf", 20, encoding="utf-8") # 参数1:字体文件路径,参数2:字体大小
draw.text((0, 0), "中值滤波", (255, 0, 0), font=font) # 参数1:打印坐标,参数2:文本,参数3:字体颜色,参数4:字体
# PIL图片转cv2 图片
cv2charimg = cv2.cvtColor(np.array(pilimg), cv2.COLOR_RGB2BGR)
cv2.imshow("medianBlur", cv2charimg)
# 方框滤波
def BoxFilter(source):
img = cv2.boxFilter(source, -1, (5, 5), normalize=1)
cv2img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # cv2和PIL中颜色的hex码的储存顺序不同
pilimg = Image.fromarray(cv2img)
draw = ImageDraw.Draw(pilimg) # 图片上打印
font = ImageFont.truetype("simhei.ttf", 20, encoding="utf-8") # 参数1:字体文件路径,参数2:字体大小
draw.text((0, 0), "方框滤波", (255, 0, 0), font=font) # 参数1:打印坐标,参数2:文本,参数3:字体颜色,参数4:字体
# PIL图片转cv2 图片
cv2charimg = cv2.cvtColor(np.array(pilimg), cv2.COLOR_RGB2BGR)
cv2.imshow("boxFilter", cv2charimg)
# 高斯滤波
def GaussianBlur(source):
img = cv2.GaussianBlur(source, (3, 3), 0)
cv2img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # cv2和PIL中颜色的hex码的储存顺序不同
pilimg = Image.fromarray(cv2img)
draw = ImageDraw.Draw(pilimg) # 图片上打印
font = ImageFont.truetype("simhei.ttf", 20, encoding="utf-8") # 参数1:字体文件路径,参数2:字体大小
draw.text((0, 0), "高斯滤波", (255, 0, 0), font=font) # 参数1:打印坐标,参数2:文本,参数3:字体颜色,参数4:字体
# PIL图片转cv2 图片
cv2charimg = cv2.cvtColor(np.array(pilimg), cv2.COLOR_RGB2BGR)
cv2.imshow("GaussianBlur", cv2charimg)
# 双边滤波
def BilateralFilter(source):
img = cv2.bilateralFilter(source,9,75,75)
cv2img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # cv2和PIL中颜色的hex码的储存顺序不同
pilimg = Image.fromarray(cv2img)
draw = ImageDraw.Draw(pilimg) # 图片上打印
font = ImageFont.truetype("simhei.ttf", 20, encoding="utf-8") # 参数1:字体文件路径,参数2:字体大小
draw.text((0, 0), "双边滤波", (255, 0, 0), font=font) # 参数1:打印坐标,参数2:文本,参数3:字体颜色,参数4:字体
# PIL图片转cv2 图片
cv2charimg = cv2.cvtColor(np.array(pilimg), cv2.COLOR_RGB2BGR)
cv2.imshow("BilateralFilter", cv2charimg)
# 高斯边缘检测
def Gaussian(source):
sobelX = cv2.Sobel(source, cv2.CV_64F, 1, 0) # x方向的梯度
sobelY = cv2.Sobel(source, cv2.CV_64F, 0, 1) # y方向的梯度
sobelX = np.uint8(np.absolute(sobelX)) # x方向梯度的绝对值
sobelY = np.uint8(np.absolute(sobelY)) # y方向梯度的绝对值
img = cv2.bitwise_or(sobelX, sobelY) #
cv2img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # cv2和PIL中颜色的hex码的储存顺序不同
pilimg = Image.fromarray(cv2img)
draw = ImageDraw.Draw(pilimg) # 图片上打印
font = ImageFont.truetype("simhei.ttf", 20, encoding="utf-8") # 参数1:字体文件路径,参数2:字体大小
draw.text((0, 0), "高斯边缘检测", "green", font=font) # 参数1:打印坐标,参数2:文本,参数3:字体颜色,参数4:字体
# PIL图片转cv2 图片
cv2charimg = cv2.cvtColor(np.array(pilimg), cv2.COLOR_RGB2BGR)
cv2.imshow("GaussianBlur", cv2charimg)
if __name__ == "__main__":
# 加载图片
img = cv2.imread("1.jpg")
cv2.namedWindow("input image", cv2.WINDOW_AUTOSIZE)
cv2.imshow("input image", img)
# BoxFilter(img)
BilateralFilter(img)
# blur(img)
# medianBlur(img)
# GaussianBlur(img)
# Gaussian(img)
cv2.waitKey(0)
cv2.destroyAllWindows()
测试结果:
【如果对您有帮助,交个朋友给个一键三连吧,您的肯定是我博客高质量维护的动力!!!】