前言卷积的各种滤波器表现python源码
前言图像深度学习必定要用到卷积,从卷积的名称和原理来看起来一时给人感觉非常的难以“理解”,其实图像做卷积运算就是对各通道的像素值进行线性运算(乘加运算),每个像素等于对周围像素乘以卷积权重并相加后的值,本篇写了一个工具,将主要的一些卷积核都写了出来,对图像进行运算,方便直观的对图像卷积运算进行效果观察,可以对3*3的卷积运算进行随意玩耍,从而加深对图像卷积的理解。
卷积的各种滤波器表现经过卷积计算可以获取各方向的边缘信息:
通过卷积也可以对图像模糊:
对图像进行锐化:
提供源码,网友们可以拿去随意玩耍:
# -*- coding: utf-8 -*-
"""
Created on Wed Aug 4 17:24:38 2021
@author: JAMES FEI
Copyright (C) 2022 FEI PANFENG, All rights reserved.
THIS SOFTEWARE, INCLUDING documentATION,IS PROTECTED BY COPYRIGHT ConTROLLED
BY FEI PANFENG ALL RIGHTS ARE RESERVED.
"""
import cv2
import numpy as np
import PySimpleGUI as sg
def is_number(s):
"""
判断是否是数字
"""
try:
float(s)
return True
except ValueError:
pass
try:
import unicodedata
unicodedata.numeric(s)
return True
except (TypeError, ValueError):
pass
return False
Covlist={
"高斯滤波器":np.array((
[0.0625, 0.125, 0.0625],
[0.125, 0.25, 0.125],
[0.0625, 0.125, 0.0625]), dtype="float32"),
"低通滤波器1":np.array((
[1, 2, 1],
[2, 4, 2],
[1, 2, 1]), dtype="float32")*(1/16),
"低通滤波器2":np.array((
[1, 1, 1],
[1, 1, 1],
[1, 1, 1]), dtype="float32")*(1/9),
"低通滤波器3":np.array((
[1, 1, 1],
[1, 2, 1],
[1, 1, 1]), dtype="float32")*(1/10),
"高通滤波器1":np.array((
[0, -1, 0],
[-1, 5, -1],
[0, -1, 0]), dtype="float32"),
"高通滤波器2":np.array((
[-1, -1, -1],
[-1, 9, -1],
[-1, -1, -1]), dtype="float32"),
"高通滤波器3":np.array((
[1, -2, 1],
[-2, 5, -2],
[1, -2, 1]), dtype="float32"),
"平移差分边缘滤波器1":np.array((
[0, 0, 0],
[-1, 1, 0],
[0, 0, 0]), dtype="float32"),
"平移差分边缘滤波器2":np.array((
[0, -1, 0],
[0, 1, 0],
[0, 0, 0]), dtype="float32"),
"平移差分边缘滤波器3":np.array((
[-1, 0, 0],
[0, 1, 0],
[0, 0, 0]), dtype="float32"),
"平移差分边缘滤波器4":np.array((
[0, 0, -1],
[0, 1, 0],
[0, 0, 0]), dtype="float32"),
"平移差分边缘滤波器5":np.array((
[0, 0, 0],
[0, 1, -1],
[0, 0, 0]), dtype="float32"),
"平移差分边缘滤波器6":np.array((
[0, 0, 0],
[0, 1, 0],
[0, -1, 0]), dtype="float32"),
"匹配边缘滤波1": np.array((
[-1, -1, -1],
[0, 0, 0],
[1, 1,1]), dtype="float32"),
"匹配边缘滤波2":np.array((
[-1, 0, 1],
[-1, 0, 1],
[-1, 0,1]), dtype="float32"),
"边缘检测滤波器1":np.array((
[-1, 0, -1],
[0, 4, 0],
[-1, 0,-1]), dtype="float32"),
"边缘检测滤波器2":np.array((
[-1, -1, -1],
[-1, 8, -1],
[-1, -1,-1]), dtype="float32"),
"边缘检测滤波器3":np.array((
[-1, -1, -1],
[-1, 9, -1],
[-1, -1,-1]), dtype="float32"),
"边缘检测滤波器4":np.array((
[1, -2, 1],
[-2, 4, -2],
[1, -2,1]), dtype="float32"),
"梯度边缘滤波器1":np.array((
[1, 1, 1],
[1, -2, 1],
[-1, -1,-1]), dtype="float32"),
"梯度边缘滤波器2":np.array((
[1, 1, 1],
[-1, -2, 1],
[-1, -1,1]), dtype="float32"),
"梯度边缘滤波器3":np.array((
[-1, 1, 1],
[-1, -2, 1],
[-1, 1,1]), dtype="float32"),
"梯度边缘滤波器4":np.array((
[-1, -1, 1],
[-1, -2, 1],
[1, 1,1]), dtype="float32"),
"自定义":np.array((
[0.0625, 0.125, 0.0625],
[0.125, 0.25, 0.125],
[0.0625, 0.125, 0.0625]), dtype="float32")
}
def CovFilter(inputimg,cov):
dst = cv2.filter2D(inputimg, -1, cov)
return dst
def CovFilterTH(inputimg,Covlist):
combolist=[key for key in Covlist.keys()]
tcombolist=tuple(combolist)
layout= [
[sg.Button('Exit')],
[sg.Text('卷积核选择',size=(15, 1)),sg.Combo(tcombolist, default_value="高斯滤波器",size=(50, 1),key='-cov-') ],
[sg.Text('当前卷积核',size=(50, 1),key='-text-')],
[sg.Input('0.0625',size=(10, 1),key='-00-'),sg.Input('0.125',size=(10, 1),key='-01-'),sg.Input('0.0625',size=(10, 1),key='-02-')],
[sg.Input('0.125',size=(10, 1),key='-10-'),sg.Input('0.25',size=(10, 1),key='-11-'),sg.Input('0.125',size=(10, 1),key='-12-')],
[sg.Input('0.0625',size=(10, 1),key='-20-'),sg.Input('0.125',size=(10, 1),key='-21-'),sg.Input('0.0625',size=(10, 1),key='-22-')],
[sg.Image(filename='', key='-IMAGE-')],
]
win = sg.Window('卷积图像滤波器', layout,disable_close=True)
cov=Covlist[combolist[0]]
def flash(win):
win_active=True
event=True
while win_active:
event, values = win.read(timeout=30)
if values['-cov-']!="自定义":
cov=Covlist[values['-cov-']]
win.Element('-00-').Update(str(cov[0][0]))
win.Element('-01-').Update(str(cov[0][1]))
win.Element('-02-').Update(str(cov[0][2]))
win.Element('-10-').Update(str(cov[1][0]))
win.Element('-11-').Update(str(cov[1][1]))
win.Element('-12-').Update(str(cov[1][2]))
win.Element('-20-').Update(str(cov[2][0]))
win.Element('-21-').Update(str(cov[2][1]))
win.Element('-22-').Update(str(cov[2][2]))
else:
cov=np.array((
[0.0625, 0.125, 0.0625],
[0.125, 0.25, 0.125],
[0.0625, 0.125, 0.0625]), dtype="float32")
cov[0][0]=float(values['-00-']) if is_number(values['-00-']) else 1
cov[0][1]=float(values['-01-']) if is_number(values['-01-']) else 1
cov[0][2]=float(values['-02-']) if is_number(values['-02-']) else 1
cov[1][0]=float(values['-10-']) if is_number(values['-10-']) else 1
cov[1][1]=float(values['-11-']) if is_number(values['-11-']) else 1
cov[1][2]=float(values['-12-']) if is_number(values['-12-']) else 1
cov[2][0]=float(values['-20-']) if is_number(values['-20-']) else 1
cov[2][1]=float(values['-21-']) if is_number(values['-21-']) else 1
cov[2][2]=float(values['-22-']) if is_number(values['-22-']) else 1
if sum(sum(cov))==0 or sum(sum(cov))==1:
pass
else:
cov=cov/sum(sum(cov))
output=CovFilter(inputimg,cov)
imgbytes = cv2.imencode('.png', output)[1].tobytes()
win['-IMAGE-'].update(data=imgbytes)
#win['-OUTPUT-'].update("video window:"+str(task0.is_alive()))
if event is None or event == 'Exit':
win.close()
win_active = False
break
flash(win)
img = cv2.imread("YMQ.jpg", 0)
CovFilterTH(img,Covlist)



