You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pygame实现Sobel滤波器异常:仅检测垂直边缘,水平边缘未识别

Sobel滤波器仅检测垂直边缘,无法识别水平边缘

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

测试资源

  • 测试原图:
    测试原图
  • 边缘检测结果图:
    边缘检测结果图
  • 放大3倍检测结果图:
    放大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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 19:14:52