Python Laplacian代码编程实现

前言:

  1. Laplacian算子是常见的各向同性算子
  2. 在边缘检测中应用为Laplacian滤波
  3. 核心要点是以Laplacian算子为模板进行卷积运算

 

code实例(python2.7):

# coding=utf-8
# **************************Declaration**************************
# @File name:        Digital Image Processing
# @Function:         Laplacian Filter
# @Author:           Ogiso Kazusa                                        
# @Date:             2018/11/3                                  
# @Version Number:   1.0 
# @Email:            xxxxx           
# ******************************end******************************


import cv2
import numpy as np


def LaplacianFilter(src):
    src = cv2.copyMakeBorder(src, 1, 1, 1, 1, cv2.BORDER_REPLICATE)
    src = np.float64(src)

    rows, cols = src.shape
    g = np.zeros(src.shape, dtype=np.float64)
    tempLap = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]], dtype=np.float32)
    for i in range(1, rows - 1):
        for j in range(1, cols - 1):
            temp = src[i - 1:i + 2, j - 1:j + 2]
            g[i, j] = abs(np.sum(temp * tempLap))

    gmax = np.max(g)
    gmin = np.min(g)
    t = gmax - gmin
    g = (g - gmin) / t * 255.0

    g = np.uint8(g + 0.5)
    dst = g[1:rows - 1, 1:cols - 1]
    return dst

#对于不保留背景的Laplacian滤波,卷积运算的矩阵模板系数和要求为0
#此外,可以通过先计算不保留背景的滤波结果与原图像之和来获得保留背景的增强边缘图像
#但是呢,由于结果像素DN值一定会大于255,会需要进行放缩运算:g=(g-gmin)/(gmax-gmin)*255
#不如直接复制代码,修改系数咯

def NoneBack_Laplacian(src):
    src = cv2.copyMakeBorder(src, 1, 1, 1, 1, cv2.BORDER_REPLICATE)
    src = np.float64(src)

    rows, cols = src.shape
    g = np.zeros(src.shape, dtype=np.float64)
    tempLap = np.array([[0, -1, 0], [-1, 4, -1], [0, -1, 0]], dtype=np.float32)#仅仅修改了系数和,使之为0,即可保留背景
    for i in range(1, rows - 1):
        for j in range(1, cols - 1):
            temp = src[i - 1:i + 2, j - 1:j + 2]
            g[i, j] = abs(np.sum(temp * tempLap))

    gmax = np.max(g)
    gmin = np.min(g)
    t = gmax - gmin
    g = (g - gmin) / t * 255.0

    g = np.uint8(g + 0.5)
    dst = g[1:rows - 1, 1:cols - 1]
    return dst


img = cv2.imread("airport_gray.tif", 0)
img1 = LaplacianFilter(img)
img2 = NoneBack_Laplacian(img)
cv2.imshow("input", img)
cv2.imshow("output", img1)
cv2.imshow("noneBackground", img2)
cv2.waitKey()
cv2.destroyAllWindows()

懂原理就很好做,如果实在是做不来,可以参考

三种滤波实现——by成长中的菜鸟zhy

你可能感兴趣的:(Python,数字图像处理)