我正在尝试从这张人脸图像中提取血管网络:面部图像。为了完成这个任务,我使用了在Anisotropic diffusion 2d images中找到的P&M各向异性扩散。然后我使用tophat变换和blackhat变换,随后我使用一个简单的阈值将所有强度值为100的像素设置为255。
问题是,在我使用阈值并尝试打开图像之后,无论我怎么尝试,图像都会显示为完全黑色: 简而言之,我的目标是使用平坦圆盘的5x5结构元素使用P&M各向异性扩散来提取血管,然后分别应用tophat和blackhat以及一个简单的阈值,并且实际上能够在此之后查看图像。
以下是我尝试它的代码:
问题是,在我使用阈值并尝试打开图像之后,无论我怎么尝试,图像都会显示为完全黑色: 简而言之,我的目标是使用平坦圆盘的5x5结构元素使用P&M各向异性扩散来提取血管,然后分别应用tophat和blackhat以及一个简单的阈值,并且实际上能够在此之后查看图像。
以下是我尝试它的代码:
import cv2
import import cv2 numpy as np
import warnings
face_img=mpimg.imread('path')
def anisodiff(img, niter=1, kappa=50, gamma=0.1, step=(1., 1.), option=1):
if img.ndim == 3:
m = "Only grayscale images allowed, converting to 2D matrix"
warnings.warn(m)
img = img.mean(2)
img = img.astype('float32')
imgout = img.copy()
deltaS = np.zeros_like(imgout)
deltaE = deltaS.copy()
NS = deltaS.copy()
EW = deltaS.copy()
gS = np.ones_like(imgout)
gE = gS.copy()
for ii in range(niter):
deltaS[:-1, :] = np.diff(imgout, axis=0)
deltaE[:, :-1] = np.diff(imgout, axis=1)
if option == 1:
gS = np.exp(-(deltaS/kappa)**2.)/step[0]
gE = np.exp(-(deltaE/kappa)**2.)/step[1]
elif option == 2:
gS = 1./(1.+(deltaS/kappa)**2.)/step[0]
gE = 1./(1.+(deltaE/kappa)**2.)/step[1]
E = gE*deltaE
S = gS*deltaS
NS[:] = S
EW[:] = E
NS[1:, :] -= S[:-1, :]
EW[:, 1:] -= E[:, :-1]
imgout += gamma*(NS+EW)
return imgout
new_img = anisodiff(face_img, niter=1, kappa=20, gamma=0.1, step=(1., 1.), option=1)
filterSize =(3, 3)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,
filterSize)
input_image = new_img
first_tophat_img = cv2.morphologyEx(input_image,
cv2.MORPH_TOPHAT,
kernel)
filterSize =(3, 3)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,
filterSize)
second_tophat_img = cv2.morphologyEx(input_image,
cv2.MORPH_BLACKHAT,
kernel)
ret, thresh1 = cv2.threshold(second_tophat_img, 200, 255, cv2.THRESH_BINARY)
即使我将阈值设置为254,图像也会变黑。