Pygame实现Sobel滤波器异常:仅检测垂直边缘,水平边缘未识别
Sobel滤波器仅检测垂直边缘,无法识别水平边缘
我尝试在图像上应用带向量的Sobel滤波器进行边缘检测,处理测试图像后发现,该实现仅能标记垂直边缘,无法识别水平边缘。我曾尝试单独绘制单一边缘类型,但结果始终一致,无法检测到水平边缘。
测试资源
- 测试原图:

- 边缘检测结果图:

- 放大3倍检测结果图:

完整实现代码
import pygame import sys import numpy as np pygame.init() def greyscale(surface: pygame.Surface): arr = pygame.surfarray.array3d(surface) # calulates the avg of the "rgb" values, this reduces the dim by 1 mean_arr = np.mean(arr, axis=2) # restores the dimension from 2 to 3 mean_arr3d = mean_arr[..., np.newaxis] # repeat the avg value obtained before over the axis 2 new_arr = np.repeat(mean_arr3d[:, :, :], 3, axis=2) # return the new surface return pygame.surfarray.make_surface(new_arr) def sobel(path: str, n: int): #path to image, image scale img = pygame.image.load(path) img = pygame.transform.scale_by(img, n) img = greyscale(img) imgmap = [[] for _ in range(img.width)] for x in range(img.width): for y in range(img.height): color = img.get_at((x,y)).b color = round(color / (255 / 2)) imgmap[x].append(img.get_at((x,y)).b) for x in range(img.width): for y in range(img.height): Gx, Gy = 0,0 try: Gx = (imgmap[x-1][y + 1] + 2 * imgmap[x-1][y] * imgmap[x-1][y - 1]) - (imgmap[x+1][y + 1] + 2 * imgmap[x+1][y] * imgmap[x+1][y - 1]) except IndexError: pass try: Gy = (imgmap[x+1][y - 1] + 2 * imgmap[x+1][y] * imgmap[x+1][y + 1]) - (imgmap[x-1][y - 1] + 2 * imgmap[x-1][y] * imgmap[x-1][y + 1]) except IndexError: pass if Gx != 0 or Gy != 0: pygame.draw.rect(img, "#FF0000", (x,y,1,1)) return img if __name__ == "__main__": img = sobel("test.png", 3) screen = pygame.display.set_mode((img.width, img.height)) screen.blit(img, (0,0)) pygame.display.flip() while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit
内容的提问来源于stack exchange,提问作者noschXL
相关产品推荐
相关产品推荐

