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)
一个简单的各异向性滤波实现和应用
最新推荐文章于 2024-09-14 18:36:11 发布