- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经计算了索贝尔梯度的大小和方向。但我一直不知道如何进一步使用它来进行形状检测。
图像>灰度>索贝尔过滤>索贝尔梯度和方向计算>下一步?
使用的 Sobel 内核是:
Kx = ([[1, 0, -1],[2, 0, -2],[1, 0, -1]])
Ky = ([[1, 2, 1],[0, 0, 0],[-1, -2, -1]])
(我只能使用 Numpy,不能使用其他 Python 语言的库。)
import numpy as np
def classify(im):
#Convert to grayscale
gray = convert_to_grayscale(im/255.)
#Sobel kernels as numpy arrays
Kx = np.array([[1, 0, -1],[2, 0, -2],[1, 0, -1]])
Ky = np.array([[1, 2, 1],[0, 0, 0],[-1, -2, -1]])
Gx = filter_2d(gray, Kx)
Gy = filter_2d(gray, Ky)
G = np.sqrt(Gx**2+Gy**2)
G_direction = np.arctan2(Gy, Gx)
#labels = ['brick', 'ball', 'cylinder']
#Let's guess randomly! Maybe we'll get lucky.
#random_integer = np.random.randint(low = 0, high = 3)
return labels[random_integer]
def filter_2d(im, kernel):
'''
Filter an image by taking the dot product of each
image neighborhood with the kernel matrix.
'''
M = kernel.shape[0]
N = kernel.shape[1]
H = im.shape[0]
W = im.shape[1]
filtered_image = np.zeros((H-M+1, W-N+1), dtype = 'float64')
for i in range(filtered_image.shape[0]):
for j in range(filtered_image.shape[1]):
image_patch = im[i:i+M, j:j+N]
filtered_image[i, j] = np.sum(np.multiply(image_patch, kernel))
return filtered_image
def convert_to_grayscale(im):
'''
Convert color image to grayscale.
'''
return np.mean(im, axis = 2)
最佳答案
您可以使用形状的以下独特特征:
一 block 砖有几个直边(从四到六个,具体取决于视角);
球体有一个弯曲的边缘;
圆柱体有两个弯曲边缘和两个直边缘(尽管它们可以完全隐藏)。
使用二值化(基于亮度和/或饱和度)并提取轮廓。然后找到直线部分,可能使用 Douglas-Peucker 简化算法。最后分析直边和弯边的顺序。
<小时/>解决最终分类任务的一种可能方法是将轮廓表示为一串 block ,无论是直的还是弯曲的,并粗略地指示长度(短/中/长)。由于分割不完善,每个形状都会对应一组模式。
您可以通过训练阶段来学习最多的模式,然后使用字符串匹配(其中字符串被视为循环)。可能会有需要仲裁的关系。另一种选择是近似字符串匹配。
关于python - 如何使用 Sobel 算子在图像中查找基本形状(砖 block 、圆柱体、球体)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52266119/
我尝试用java实现Sobel边缘检测。它有点有效,但我收到了很多看似随机的噪音...... 我将图像加载为 BufferedImages 并首先将其转换为灰度图像(通过我在网上找到的算法)。之后我计
我尝试在 Java 中实现 Sobel 运算符,但结果只是一些像素的混合。 int i, j; FileInputStream inFile = new FileInputStream
我有每个像素的 Sobel 算子的梯度。在我的例子中是 320x480。但是我怎样才能将它们与方向联系起来呢?例如,我打算绘制指纹方向图。那么,我该如何开始呢? 是将梯度分成 block (例如 16
我为 Sobel 运算符编写了一个用于边缘检测的类,但是当我使用示例图像时,我的边缘消失了。如果有人可以帮助我,我将不胜感激。 import java.awt.image.BufferedImage;
x-导数 Sobel 看起来是这样的: -1 0 +1 -2 0 +2 -1 0 +1 假设我的图像有两个样本看起来像这样(0=黑色,1=白色): 0 0 1 1 0 0 0 0
我正在使用图像上的索贝尔边缘检测进行作业。我目前正在努力进行渐变操作。编译时收到“二元运算符 '*' 的操作数类型错误”错误。我认为这可能是因为我将所有像素定义为字母,并且我不确定下一步应该是什么。任
我的 Sobel 边缘检测算子的输出很奇怪。这是我的代码: BufferedImage temp = img; float kernelx[][] = {{-1, 0, 1},{-2,
我想在我的 android 应用程序中使用 Sobel 运算符。但是我不明白如何使用一个像素。 int sobel_x[][] = {{-1, 0, 1}, {-2, 0, 2},
我想在图像上使用高斯模糊作为使用 sobel 边缘检测过滤器的预处理步骤。 我以前在灰度图像上有效地实现了 sobel 和高斯模糊运算符,但是,我从未尝试过在彩色图像上使用它们。 之前,我一直采用像素
对于嵌入式设计,我试图在不使用缓冲器的情况下在板上实现索贝尔边缘检测。即我直接从屏幕上阅读和写作。但是,我可以存储大约一两个图像宽度的数据以供以后引用。这是由于董事会规定的限制。但是我陷入了一些问题。
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
我试图理解 cv2.Sobel 中的 scale 参数.将 scale 设置为 1/8,我沿 x 轴得到如下输出: 但是对于 scale = 10 或 scale = 100,输出非常相似。 上面两幅
我正在使用 sobel 运算符通过 EmguCV 3.0(OpenCV 的 .NET 包装器)检测灰度图像中的边缘。 我使用的代码是 Image gray = new Image(@"C:\gray.
我正在使用 skimage 创建一个与此类似的 sobel 过滤器图像... 我想知道有没有办法锐化这个 sobel 滤镜图像?比如说,把那些比较淡的白线去掉,比如气球后面的淡淡的线条? 我用 Ski
OpenCV 文档说,(order == 0) 表示不会在这个方向上应用导数,即不会执行此内核的计算。 (Order == 1) 意味着这个方向的图像和内核只是一个简单的卷积。 但是 (order =
我想在文本中找到笔划的方向。 Sobel 算子如何用于此目的? 这张图显示的是dp,也就是梯度方向。我想知道如何应用 Sobel 运算符找到要选择的像素,从 p 到 q,沿着路径 sp,到找到边缘上的
我正在尝试对墙壁图像使用 sobel 过滤器,但它不起作用。 我的代码是: im=scipy.misc.imread('IMG_1479bis.JPG') im = im.astype('int32'
阅读一篇论文,我很难理解所描述的算法: 给定手写样本的黑白数字图像,裁剪出单个字符进行分析。由于这可以是任意大小,因此算法需要考虑到这一点(如果更简单,我们可以假设大小为 2^n x 2^m)。 现在
我正在尝试在水平和垂直方向上实现 sobel 运算符。但不知何故我得到了反向输出。我在下面附上的代码。对于水平蒙版 char mask [3][3]= {{-1,-2,-1},{0,0,0},{1,
我在使用 Sobel 算子进行边缘检测时遇到问题:它会产生太多假边缘,效果如下图所示。我正在使用 3x3 sobel 运算符 - 首先提取垂直然后水平,最终输出是每个滤波器输出的幅度。合成图像的边
我是一名优秀的程序员,十分优秀!