首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sobel算子x_约束

Sobel算子x_约束
EN

Data Science用户
提问于 2019-01-06 07:57:13
回答 1查看 29关注 0票数 0

我正在试用Sobel垂直操作符来识别图片中的垂直边缘。在每幅图像中都有一个矩形,但区别是,在1幅图像中,矩形中的2条垂直线相距1像素,而在另一图像中,相距超过1像素,如下所示。

现在,当我运行sobel垂直过滤器,我的期望是,在这两种情况下,我应该得到2个边。但令我惊讶的是,它返回了较大矩形的2条边,但对于较小的矩形只返回了一条边,如下所示。

我的Python代码如下。

代码语言:javascript
复制
from PIL import Image
import numpy as np
im = Image.open('Test.png').convert('L')
im.save('greyscale.png')
pix_val = np.array(list(im.getdata())).reshape(81,91)
for i in range(12,14):
    for j in range(12,78):
        pix_val[i,j]=255      
for i in range(63,65):
    for j in range(12,78):
        pix_val[i,j]=255
for i in range(14,63):
    for j in range(12,14):
        pix_val[i,j]=255
for i in range(14,63):
    for j in range(76,78):
        pix_val[i,j]=255
Oim1=Image.fromarray(pix_val.astype(np.uint8))
Oim1.save('out1.bmp')
pix_val2=np.delete(pix_val,range(16,75), 1)
Oim2=Image.fromarray(pix_val2.astype(np.uint8))
Oim2.save('out2.bmp')
from scipy import ndimage
dy1 = ndimage.sobel(Oim1, 1)
Oim3=Image.fromarray(dy1.astype(np.uint8))
Oim3.save('Sobel1.bmp')
dy2 = ndimage.sobel(Oim2, 1)
Oim4=Image.fromarray(dy2.astype(np.uint8))
Oim4.save('Sobel2.bmp')

这是sobel算子的一个限制吗?它不能检测到彼此非常接近的边缘吗?

EN

回答 1

Data Science用户

发布于 2019-01-06 12:57:35

这不是Sobel算子的限制,如果边界是清晰的,甚至可以检测到单个像素宽的矩形。

我运行了您的代码,但是只使用一个空的映像作为"im“映像,它对我来说很好。

下面是我的代码(类似于您的代码,只是没有“Test.png”和不保存图像):

代码语言:javascript
复制
from PIL import Image
import numpy as np
from scipy import ndimage

im = Image.fromarray(np.zeros((81,91)).astype(np.uint8))
pix_val = np.array(list(im.getdata())).reshape(81,91)
for i in range(12,14):
    for j in range(12,78):
        pix_val[i,j]=255      
for i in range(63,65):
    for j in range(12,78):
        pix_val[i,j]=255
for i in range(14,63):
    for j in range(12,14):
        pix_val[i,j]=255
for i in range(14,63):
    for j in range(76,78):
        pix_val[i,j]=255

Oim1 = Image.fromarray(pix_val.astype(np.uint8))
pix_val2 = np.delete(pix_val,range(16,75), 1)
Oim1.show()

Oim2 = Image.fromarray(pix_val2.astype(np.uint8))
Oim2.show()

dy1 = ndimage.sobel(Oim1, 1)
Oim3 = Image.fromarray(dy1.astype(np.uint8))
Oim3.show()

dy2 = ndimage.sobel(Oim2, 1)
Oim4 = Image.fromarray(dy2.astype(np.uint8))
Oim4.show()

我得到的是:

票数 0
EN
页面原文内容由Data Science提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://datascience.stackexchange.com/questions/43570

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档