Python实现卷积计算,平滑过滤,高斯过滤,Sobel算子,Prewitt算子

Python实现卷积计算,平滑过滤,高斯过滤,Sobel算子,Prewitt算子_第1张图片Python实现卷积计算,平滑过滤,高斯过滤,Sobel算子,Prewitt算子_第2张图片Python实现卷积计算,平滑过滤,高斯过滤,Sobel算子,Prewitt算子_第3张图片
Python实现卷积计算,平滑过滤,高斯过滤,Sobel算子,Prewitt算子_第4张图片

代码:

#!/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)

你可能感兴趣的:(Python,计算机视觉)