我正在寻找一种算法来检测图像中的圆圈.图像是黑白的.背景为白色,圆圈彼此不重叠,或图像中的任何其他元素.图像包括一些其他形状和一些文本.
如果有一些开源.NET库来做这件事,我也想了解它.
我有一个特定的运动学作为一个更复杂的机器的一部分,需要计算一些非常困难(更不可能)的物理参数,用我可以使用的仪器以适当的精度进行测量
[运动学]
首先看它是一个简单1
的自由度臂(黑色),它可以围绕x
轴旋转.它有一个重量,迫使它一直向上,直到它达到机械终点(角度a0
)或一些半径的管(蓝色)r0
.手臂旋转中心位于y0
.管可以移动到任何y(t)
高度.
[用法]
这用于测量管的半径以进行进一步处理.可以计算半径(通过基本测角仪),这导致图像底部的方程.常数a0,y0,z0
非常难以测量(它在复杂的机械内部),因此距离的测量精度是最小值0.1 mm
和角度0.1 deg
,甚至是有问题的.
[校准]
所以我决定尝试从机器本身完成的一组测量中计算这些参数(自动校准).所以我有已知半径的校准管r0
.所有绿色参数都可以作为常量处理.现在我沿着y
轴定位管子以尽可能多地覆盖手臂的角度.遗憾的是,该范围仅为20 degrees
(对于当前的机器设置)记住测量a(t)
的预设y(t)
...作为n
点数据集.这给了我n
超越方程组.从此我尝试/猜测a0,y0,z0
记住最佳解决方案的"所有"可能性(最接近r0
)
[近似a0,y0,z0]
近似是基于这类矿井:
//---------------------------------------------------------------------------
class approx
{
public:
double a,aa,a0,a1,da,*e,e0;
int i,n;
bool done,stop;
approx() { a=0.0; aa=0.0; a0=0.0; a1=1.0; da=0.1; e=NULL; e0=NULL; i=0; n=5; done=true; }
approx(approx& a) { *this=a; …
Run Code Online (Sandbox Code Playgroud) 从http://ccl.northwestern.edu/netlogo/models/community/Astardemo,我通过使用网络中的节点来定义最低成本路径来编码A*算法.代码似乎有效,但是当我在大空间尺度上使用它时它太慢了.我的景观有1000个补丁x 1000个补丁,1个补丁= 1个像素.即使我减少400补丁x 400补丁1补丁= 1像素,它仍然太慢(我不能修改我的景观低于400补丁x 400补丁).这是代码:
to find-path [ source-node destination-node]
let search-done? false
let search-path []
let current-node 0
set list-open []
set list-closed []
let list-links-with-nodes-in-list-closed []
let list-links []
set list-open lput source-node list-open
while [ search-done? != true]
[
ifelse length list-open != 0
[
set list-open sort-by [[f] of ?1 < [f] of ?2] list-open
set current-node item 0 list-open
set list-open remove-item 0 list-open
set list-closed lput current-node list-closed
ask current-node
[ …
Run Code Online (Sandbox Code Playgroud) 我正在研究一个采用粉末衍射图像并试图找到图像中所有椭圆环的项目.
我正在使用RANSAC算法将椭圆拟合到数据中,然后减去这些点(内点)并继续拟合另一个椭圆,直到内部比率变得足够小.
我的问题是,根据我如何设置阈值距离,它要么应该比应有的椭圆更多,要么不够.
我想知道无论如何要改进RANSAC更准确还是我应该使用更好的算法?
原始图像
阈值距离设置为5
阈值距离设定为10
是否有任何算法可以使用有限数量的线段和圆弧(恒定曲率)来逼近 xy 平面(即由 x 和 y 定义的有序点集)上的路径?结果曲线需要是 C1(斜率的连续性)。
最大数量或线段和弧线可以是一个参数。另一个有趣的约束是防止两个连续的圆弧没有中间线段连接它们。
我看不出有任何方法可以做到这一点,我认为不存在针对它的方法,但欢迎对此目标的任何暗示。
例子:
考虑这条路。它看起来像一条线,但实际上是一组非常接近的点的有序套件。没有噪音,点序列的顺序是众所周知的。
我想用最少连续的线段和圆弧(假设 10 个线段和 10 个圆弧)和 C1 连续性来近似这条曲线。段/弧的数量本身不是一个目标,但我需要任何参数来减少/增加这个数量,以达到一定的参数化简单性,但代价是精度损失。
解决方案:
这是我的解决方案,基于 Spektre 的回答。红色曲线为原始数据。黑线是线段,蓝色曲线是圆弧。绿色十字是显示半径的圆弧中心,蓝色十字是线段可能连接的点。
我试图将已知的明确定义的形状(例如,盒子,圆柱体;具有可配置的位置,旋转和尺寸)拟合到一组点,这些点具有通过采样3D网格生成的法线。我当前的方法是为每个形状定义自定义拟合函数,并将其传递给第三方优化函数:
fitness = get_fitness(shape_parameters, points)
best_parameters = external.optimise(get_fitness, initial_parameters, points)
Run Code Online (Sandbox Code Playgroud)
(作为参考,我目前正在使用Python 3并scipy.optimize.minimize
带有边界,但是语言无关紧要)。
矩形的适应度函数看起来像
def get_fitness(parameters, points):
side_fitnesses = []
for side in [top, right, bottom, left, back, front]:
dists = get_side_distances(parameters, points, side)
ndevs = get_side_normal_deviations(parameters, points, side)
side_fitnesses.append(combine_dists_and_ndevs(dists, ndevs))
fitnesses = choose_best_side_for_each_point(side_fitnesses)
return mean(fitnesses)
Run Code Online (Sandbox Code Playgroud)
但是,这意味着我必须确定异常值(有/没有缓存),并且一次只能拟合一个形状。
例如(在2D中),对于这些点(具有法线),我想要以下结果:
请注意,返回了多个形状,并且忽略了异常值。通常,输入数据中可以有许多,一种或零种形状。后处理可以删除无效(例如,太小)的结果。
注意:我真正的问题是3D。我具有真实世界对象的3D网格表示的片段,这意味着我除了上面的示例中的点/法线(例如面部区域和连接性)外,还具有更多信息。
进一步阅读:
PS:我不确定StackOverflow是否是此问题的最佳StackExchange网站
任何人都知道一种实际上有效的工具(我尝试了几种,但是没有用),并且支持彩色图像。如果有人知道如何实现此功能,或者知道任何实现(C#)的组件,我将不胜感激。
谢谢你的帮助
下面的程序有效,但是将所有文件保留为黑白。
我正在检测圆形物体的边缘,并获得"凹凸不平"的不规则边缘.是否有平滑的边缘,以便我有一个更均匀的形状?
例如,在下面的代码中,我生成一个"颠簸"的圆圈(左).我是否可以使用平滑或移动平均函数来获得或近似"平滑"圆(右).最好有一些参数,我可以控制,因为我的实际图像不是完美的圆形.
import numpy as np
import matplotlib.pyplot as plt
fig, (bumpy, smooth) = plt.subplots(ncols=2, figsize=(14, 7))
an = np.linspace(0, 2 * np.pi, 100)
bumpy.plot(3 * np.cos(an) + np.random.normal(0,.03,100), 3 * np.sin(an) + np.random.normal(0,.03,100))
smooth.plot(3 * np.cos(an), 3 * np.sin(an))
Run Code Online (Sandbox Code Playgroud)
algorithm ×4
geometry ×3
a-star ×1
c# ×1
c++ ×1
data-fitting ×1
math ×1
netlogo ×1
numpy ×1
performance ×1
python ×1
scikit-image ×1
shapes ×1
svg ×1