代码:
#!/usr/bin/python
# -*- coding:utf8 -*-
from cv2 import *
import numpy
'''实现卷积运算'''
def ImgConvolve(input,kernel):
'''获取图片和卷积核的宽高'''
WImg = input.shape[0]
HImg = input.shape[1]
Wkernel = kernel.shape[0]
Hkernel = kernel.shape[1]
AddW = (Wkernel-1)/2
AddH = (Hkernel-1)/2
'''在原图的宽高外侧分别扩充卷积核的一半'''
ImgTemp = numpy.zeros([WImg + AddW*2,HImg + AddH*2])
'''将原图拷贝到临时图片的中间'''
ImgTemp[AddW:AddW+WImg,AddH:AddH+HImg] = input[:,:]
'''初始化一张同样大小的图片作输出的图片'''
output = numpy.zeros_like(a=ImgTemp)
'''将扩充图和卷积核做卷积运算'''
for i in range(AddW,AddW+WImg):
for j in range(AddH,AddH+HImg):
output[i][j] = int(numpy.sum(ImgTemp[i-AddW:i+AddW+1,j-AddW:j+AddW+1]*kernel))#计算平均值
return output[AddW:AddW+WImg,AddH:AddH+HImg]
'''实现均值过滤'''
def myAverage(input,kernel):
'''均值过滤的卷积核大小大于1,需要进行规格化'''
return ImgConvolve(input,kernel)*(1.0/numpy.sum(kernel))
'''生成高斯矩阵'''
def Gaussian(sigma):#传入方差
width = heigh = 2*sigma+1
gaussianKernel = numpy.zeros([width,width])
for x in range(-sigma,sigma+1):
for y in range(-sigma,sigma+1):
gaussianKernel[x+sigma][y+sigma] = numpy.exp(-0.5*(x**2+y**2)/(sigma**2));#高斯函数求值
return gaussianKernel
'''Sobel算子'''
def Sobel(img,style):
''' Sobel算子横向和纵向的卷积核'''
Gx = numpy.array([[-1, 0, 1],
[-2, 0, 2],
[-1, 0, 1]])
Gy = numpy.array([[-1,-2,-1],
[ 0, 0, 0],
[ 1, 2, 1]])
sobelX = ImgConvolve(img,Gx)
sobelY = ImgConvolve(img,Gy)
if(style == 0):
return sobelX
if(style == 1):
return sobelY
if(style == 2):
return abs(sobelX)+abs(sobelY)
'''Prewitt算子'''
def Prewitt(img,style):
''' Prewitt算子横向和纵向的卷积核'''
Gx = numpy.array([[-1, 0, 1],
[-1, 0, 1],
[-1, 0, 1]])
Gy = numpy.array([[-1,-1,-1],
[ 0, 0, 0],
[ 1, 1, 1]])
prewittX = ImgConvolve(img,Gx)
prewittY = ImgConvolve(img,Gy)
prewittAdd = numpy.zeros_like(prewittX)
[rows,cols] = prewittAdd.shape
for i in range(0,rows):
for j in range(0,cols):
'''X方向和Y方向叠加'''
prewittAdd[i][j] = prewittX[i][j]+prewittY[i][j]
if(style == 0):
return prewittX
if(style == 1):
return prewittY
if(style == 2):
return prewittAdd
'''平滑卷积3X3'''
kernel_3x3 = numpy.array([[1,1,1],
[1,1,1],
[1,1,1]])
'''平滑卷积5X5'''
kernel_5x5 = numpy.array([[1,1,1,1,1],
[1,1,1,1,1],
[1,1,1,1,1],
[1,1,1,1,1],
[1,1,1,1,1]])
img = cv2.imread("balloon.jpg",cv2.IMREAD_GRAYSCALE)
k3 = myAverage(img,kernel_3x3)
cv2.imwrite("avg_k3.jpg", k3)
k5 = myAverage(img,kernel_5x5)
cv2.imwrite("avg_k5.jpg", k5)
gaosi3x3 = myAverage(img,Gaussian(1))
cv2.imwrite("gaosi3x3.jpg", gaosi3x3)
sigma7x7 = myAverage(img,Gaussian(3))
cv2.imwrite("gaosi7x7.jpg", sigma7x7)
gaosi9x9 = myAverage(img,Gaussian(5))
cv2.imwrite("gaosi9x9.jpg", gaosi9x9)
img2 = cv2.imread("buildingGray.jpg",cv2.IMREAD_GRAYSCALE)
sobelrow = Sobel(img2,0)
cv2.imwrite("sobelrow.jpg", sobelrow)
sobelcol = Sobel(img2,1)
cv2.imwrite("sobelcol.jpg", sobelcol)
sobelmix = Sobel(img2,2)
cv2.imwrite("sobelmix.jpg", sobelmix)
prewittrow = Prewitt(img2,0)
cv2.imwrite("prewittrow.jpg", prewittrow)
prewittcol = Prewitt(img2,1)
cv2.imwrite("prewittcol.jpg", prewittcol)
prewittmix = Prewitt(img2,2)
cv2.imwrite("prewittmix.jpg", prewittmix)