【发布时间】:2019-02-26 16:10:19
【问题描述】:
我有一个包含两类图像的数据集:城市景观和景观。我想做的是计算每个图像边缘的梯度(方向),并显示城市景观图像比风景图像具有更多的垂直/水平边缘。
我所做的是计算垂直、水平、45 度和 135 度边缘。我对图像应用了 Canny 过滤器,计算了 x,y 梯度,并对图像应用了一个阈值,表明它显示了高于该阈值的边缘。此处可以看到此阈值的结果:
这是我用于此图像处理以及计算渐变的代码:
def gradient(image):
# Step 1
img = image
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# Step 2
bi = cv2.bilateralFilter(gray, 15, 75, 75)
# Step 3
dst = cv2.Canny(bi, 100, 200)
#print(np.count_nonzero(dst)) #--> make sure it's not all zeroes
# Step 4
#--- create a black image to see where those edges occur ---
mask = np.zeros_like(gray)
#--- applying a threshold and turning those pixels above the threshold to white ---
mask[dst > 0.1 * dst.max()] = 255
# Step 5
img[dst > 0.1 * dst.max()] = [255, 0, 0] #--- [255, 0, 0] --> Red ---
Gx = cv2.Sobel(mask,cv2.CV_64F,1,0,ksize=5)
Gy = cv2.Sobel(mask,cv2.CV_64F,0,1,ksize=5)
#orientation of the edges
theta = np.arctan2(Gy, Gx)
#magnitude
M = np.sqrt(Gx*Gx + Gy*Gy)
#Vertical edges:
v = abs(Gy)
#Horizontal edges:
h = abs(Gx)
#45 Degree edges:
deg45 = M*abs(np.cos(theta - np.pi/4))
#135 Degree edges:
deg135 = M*abs(np.cos(theta - 3*np.pi/4))
print('Vertical:')
#print(v)
print(np.count_nonzero(v))
print('Horizontal:')
#print(h)
print(np.count_nonzero(h))
我想要的是为上图中显示为红色的边缘计算v,h,deg45,deg135(第 5 步)。如果这是不可能的,那么对带有白色边缘的图像执行此操作(步骤 4)。有人可以帮忙吗?
编辑:为了避免混淆,我想做的是获取给定图像中垂直、水平等边缘的数量,以便我可以比较城市景观与景观的这些数字图片。
【问题讨论】:
-
你能解释一下“计算边缘的 v,h,deg45,deg135”是什么意思吗?
-
我有垂直、水平、45 度和 135 度角梯度的公式。我要做的是对图像中的每个红色边缘,找到边缘的梯度,然后计算每个图像的垂直、水平等的数量
-
垂直、水平等渐变是什么意思?梯度是一个向量,不应该随方向改变。是否要在 (0,1)、(1,0)、(1,1) 和 (1,-1) 方向上投影渐变?
-
你是对的。我的意思是我想计算图像中有多少垂直边缘。 (如果这样更清楚)
-
垂直边缘是否需要精确的水平渐变?水平在 +/-5 度以内? 15度?您是否已经定义了边缘或仅定义了像素梯度?你更关心垂直边的总长度还是垂直边的总数(总长度很容易,但总数可能需要你运行某种聚类算法)?
标签: python image-processing canny-operator