我得到两张显示完全相同内容的图像:二维高斯形 Blob 。我将这两个 16 位 png 文件称为“left.png”和“right.png”。但由于它们是通过略有不同的光学设置获得的,因此相应的点(物理上相同)出现在略有不同的位置。这意味着右侧会以非线性方式轻微拉伸(stretch)、扭曲或如此。因此我想从左到右进行转换。
因此对于左侧的每个像素及其 x 和 y 坐标,我想要一个函数为我提供指向右侧相应像素的位移矢量的分量。
在以前的方法中,我尝试获取相应点的位置以获得相对距离 deltaX 和 deltaY。然后我将这些距离拟合到 T(x,y) 的二阶泰勒展开,得到左侧每个像素 (x,y) 的位移矢量的 x 和 y 分量,指向相应的像素(x',y') 在右边。
为了获得更一般的结果,我想使用归一化互相关。为此,我将左侧的每个像素值与右侧的相应像素值相乘,然后对这些乘积求和。我正在寻找的转换应该连接将使总和最大化的像素。所以当总和最大化时,我知道我乘以了相应的像素。
我真的尝试了很多,但没有成功。我的问题是你们中是否有人有过类似的想法或曾经做过类似的事情。
import numpy as np
import Image
left = np.array(Image.open('left.png'))
right = np.array(Image.open('right.png'))
# for normalization (http://en.wikipedia.org/wiki/Cross-correlation#Normalized_cross-correlation)
left = (left - left.mean()) / left.std()
right = (right - right.mean()) / right.std()
如果我能把这个问题说得更清楚,请告诉我。我仍然需要检查如何使用 latex 发布问题。
非常感谢您的输入。
[左.png] http://i.stack.imgur.com/oSTER.png [右.png] http://i.stack.imgur.com/Njahj.png
我担心,在大多数情况下,16 位图像显示只是黑色(至少在我使用的系统上):( 但当然那里有数据。
我试着澄清我的问题。我正在寻找一个带有位移矢量的矢量场,从 left.png 中的每个像素指向 right.png 中的相应像素。我的问题是,我不确定自己的约束条件。
其中向量 r(分量 x 和 y)指向 left.png 中的一个像素,向量 r-prime(分量 x-prime 和 y-prime)指向 right.png 中的相应像素。对于每个 r 都有一个位移矢量。
我之前所做的是,我手动找到矢量场 d 的分量并将它们拟合到二次多项式:
所以我装了:
这对你来说有意义吗?是否有可能获得所有具有互相关性的 delta-x(x,y) 和 delta-y(x,y)?如果相应的像素通过位移矢量链接在一起,则互相关应该最大化,对吗?
所以我想到的算法如下:
关于变形:可以先沿 x 和 y 方向移动以最大化互相关,然后在第二步中拉伸(stretch)或压缩 x 和 y 相关的,并在第三步中变形二次 x 和 y -依赖并重复此过程迭代?我真的很难用整数坐标来做这件事。你认为我必须对图片进行插值以获得连续分布吗?我得再考虑一下:(感谢大家的参与:)
最佳答案
OpenCV(以及 python Opencv 绑定(bind))有一个实现 StarDetector 的 this algorithm 类。
作为替代方案,您可以查看 OpenCV SIFT 类,它代表尺度不变特征变换。
更新
关于您的评论,我知道“正确的”转换将最大化图像之间的互相关,但我不明白您如何选择要最大化的转换集。也许如果您知道三个匹配点的坐标(通过一些启发式方法或手动选择它们),并且如果您期望亲和性,则可以使用类似 cv2.getAffineTransform 的东西为您的最大化过程提供良好的初始转换。从那里你可以使用小的附加转换来获得一个最大化的集合。但在我看来,这种方法就像是重新发明了一些 SIFT 可以处理的东西。
要实际转换您的测试图像,您可以使用 cv2.warpAffine ,它也可以处理边界值(例如用 0 填充)。要计算互相关,您可以使用 scipy.signal.correlate2d 。
更新
您最近的更新确实为我阐明了一些要点。但我认为位移矢量场不是最自然的东西,这也是误解的来源。我想的更多是沿着全局变换T的思路,它应用于左图的任何点(x,y),给出(x',y')=T(x,y)右侧,但 T 对于每个像素具有相同的解析形式。例如,这可能是位移、旋转、缩放的组合,也可能是某种透视变换。我不能说希望找到这样的变换是否现实,这取决于你的设置,但如果场景在物理上是相同的,我会说期待一些仿射变换是合理的。这就是我建议 cv2.getAffineTransform 的原因。从这样的 T 计算位移矢量场当然是微不足道的,因为这只是 T(x,y)-(x,y)。
最大的优势是您的变换只有很少的自由度,而不是我认为在位移矢量场中有 2N 个自由度,其中 N 是亮点的数量。
如果它确实是一个仿射变换,我会建议一些这样的算法:
更新
cv2.getAffineTransform 似乎需要一个笨拙的输入数据类型“float32”。假设源坐标是 (sxi,syi),目标坐标是 (dxi,dyi),i=0,1,2,那么你需要的是
src = np.array( ((sx0,sy0),(sx1,sy1),(sx2,sy2)), dtype='float32' )
dst = np.array( ((dx0,dy0),(dx1,dy1),(dx2,dy2)), dtype='float32' )
result = cv2.getAffineTransform(src,dst)
关于python - 使用 python 和互相关进行图像配准,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9225429/
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于
我正在尝试使用ruby和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h