一个简单的各异向性滤波实现和应用

import cv2
import os
import numpy as np
from math import pi
import math
def disfilter(img):
    # other angle
    d = 7 # 单数
    numdir = 8 # 复数
    binarayth = 110
    consize = 25
    edgesize = 20
    mask = np.zeros(img.shape)
    mask[edgesize:-edgesize,edgesize:-edgesize] = 1
    mask = np.int8(mask)



    img = cv2.GaussianBlur(img, (5, 5), 0)

    kernelother = []
    centerx = np.floor(d / 2)
    centery = np.floor(d / 2)

    internal = pi / numdir

    for k in range(0,numdir,1):
        k = k*internal
        k = np.tan(k)
        b = centery - k * centerx
        tempkernel = np.zeros((d, d))
        for col in range(d):
            row = k * col + b
            row = np.min([d-1,int(np.floor(row))])
            row = int(np.max([row,0]))
            #print(col,row)
            tempkernel[col,row] = 1
        tempkernel = tempkernel/(np.sum(tempkernel))
        kernelother.append(tempkernel)

    imgset = []
    for tarkernel in kernelother:
        tarkernel = np.array(tarkernel)
        tarimg = cv2.filter2D(img, -1, tarkernel)
        imgset.append(tarimg)



    imgset = np.array(imgset)
    imgmax = np.max(imgset,axis=0)

    imgmin = np.min(imgset,axis=0)
    imgcha = imgmax - imgmin
    imgstd = np.std(imgset,axis=0)
    imgstd =cv2.normalize(imgstd, None, 0, 255, cv2.NORM_MINMAX)
    imgmax = cv2.normalize(imgmax, None, 0, 255, cv2.NORM_MINMAX)

    #imgcha = cv2.normalize(imgcha, None, 0, 255, cv2.NORM_MINMAX)
    imgstd = np.int8((imgstd+imgmax))
    imgstd = cv2.normalize(imgstd, None, 0, 255, cv2.NORM_MINMAX)
    imgstd = np.array(imgstd)

    print(imgstd.shape)
    ret,bin = cv2.threshold(imgmax,binarayth,255, cv2.THRESH_BINARY)


    kernel_re = []
    rows, cols = [5,5]
    for i in range(rows):
        result = [0 if math.sqrt((i - 3) ** 2 + (j - 3) ** 2) > 3 else 1 for j in range(cols)]
        kernel_re.append(result)
    kernel_re = np.array(kernel_re, np.uint8)

    bin = cv2.dilate(bin,kernel=kernel_re)

    bin = np.uint8(bin * mask)

    contours, hierarchy = cv2.findContours(bin, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    finalcon = []
    for tempcon in contours:
        connum = cv2.contourArea(tempcon)
        #connum = len(tempcon)
        if connum > consize:
            finalcon.append(tempcon)

    bin[:] = 0
    cv2.drawContours(bin, finalcon, -1, (255), 5)



    cv2.imshow("bin",bin)

    cv2.imshow("img",img)
    cv2.imshow("imgmax",imgmax)
    cv2.imshow("imgmin",imgmin)
    cv2.imshow("imgcha",imgcha)
    cv2.imshow("imgstd",imgstd)
    cv2.imshow("imgmaxcha",imgmax-img)
    cv2.imshow("imgmincha",imgmin-img)
    cv2.imshow("imgchacha",imgcha-img)
    cv2.waitKey(0)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值