- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个使用 canny 边缘检测器派生的 Mat
对象,我使用 findContours
函数从此类图像中提取轮廓。现在我想为每个这样的轮廓做的是以某种方式检查两侧的颜色。
对于“颜色”位,我已经离散化了 HSI 颜色空间,但是我对如何在给定轮廓的两侧“选择颜色”感到非常困惑。
有没有办法轻松做到这一点?
最佳答案
您可以使用应用了 Canny 边缘检测器的图像来执行此操作。乘坐gradient那个形象。梯度是一个 vector 。如 wiki 页面图像(如下所示)所示,梯度指向增长率最大的方向。如果取负梯度,那么它指向下降率最大的方向。因此,如果您在轮廓点对图像的梯度进行采样,则这些点的正梯度和负梯度应指向轮廓点任一侧的区域。因此,您可以沿着这些方向对点进行采样,以了解您想要的颜色。
图像渐变:
示例 python 代码显示了如何为下面显示的简单图像完成此操作。它使用 Sobel 来计算梯度。
输入图片:
Canny 边缘和采样点:
绿色:轮廓上的点
红色:指向正梯度方向
蓝色:指向负梯度方向
import cv2
import numpy as np
from matplotlib import pyplot as plt
im = cv2.imread('grad.png', 0)
dx = cv2.Sobel(im, cv2.CV_32F, 1, 0)
dy = cv2.Sobel(im, cv2.CV_32F, 0, 1)
edge = cv2.Canny(im, 64, 192)
dx = dx / np.sqrt(dx*dx + dy*dy + 0.01)
dy = dy / np.sqrt(dx*dx + dy*dy + 0.01)
r = 20
y, x = np.nonzero(edge)
pos1 = (np.int32(x[128]+r*dx[y[128], x[128]]), np.int32(y[128]+r*dy[y[128], x[128]]))
pos2 = (np.int32(x[128]-r*dx[y[128], x[128]]), np.int32(y[128]-r*dy[y[128], x[128]]))
im2 = cv2.cvtColor(edge, cv2.COLOR_GRAY2BGR)
cv2.circle(im2, pos1, 10, (255, 0, 0), 1)
cv2.circle(im2, pos2, 10, (0, 0, 255), 1)
cv2.circle(im2, (x[128], y[128]), 10, (0, 255, 0), 1)
plt.imshow(im2)
关于c++ - OpenCV findContours,如何检查两侧的颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51560011/
我设法检查一个整数是否是从右到左排序的,但我如何检查从左到右的顺序?也许我应该做 2 个功能,一个从左到右检查,另一个从右到左检查?例如,我将 return 0; 替换为第二个函数,该函数检查它是否从
我想在两侧“剪切”我的页面,如下所示: http://i.stack.imgur.com/ngZrp.jpg 演示:https://jsfiddle.net/r2g0eyxf/3/ #left {
我很难在页面的两边都获得背景: 风格 .left { background: url(wax.png); width: 15%; position: absolute; lef
我需要逐步证明:7 + O(n) = O(n) 当两边都有大O的时候,我不知道该怎么做。 我想我理解大 O 符号的概念,但为什么两边都有大 O? 最佳答案 这种表示法的使用不符合大 O 表示法的正式定
我的目标是使 slider 宽度为 1280 像素并位于页面中央。我希望内容的边缘在两侧都有隐藏的溢出。例如,我希望内容的中心始终位于页面的中心,随着浏览器的大小调整,每一边都被切断,并且没有出现水平
我在做什么:在悬停按钮时,我添加了一个 5px 的底部边框。 JS fiddle : http://jsfiddle.net/mUCNB/ 问题: 问题是边框底部在左侧和右侧都延伸了 1px。 问题:
我是一名优秀的程序员,十分优秀!