我试图找到两幅图像之间一个或多个差异的轮廓。
假设您有两张相同的图片。然后在其中一张图像的随机位置添加一个不透明的正方形和三角形。形状不能重叠。
我想获取这些形状最外层像素的坐标,这些坐标必须“分组”-> 我想获取两组坐标,每个形状一组。
我已经尝试比较每个像素并获取最小和最大 x 和 y 值,这些值给出了形状的边界框。这有两个问题:它给了我边界框,而不是形状的轮廓。并且只有当图像中的形状不超过一个时,它才有效。
我这辈子都想不出办法来完成这件事。
我非常喜欢 php,但可以使用 gd 或 imagick。我稍微偏向于 gd,但 imagick 更快更强大,所以也可以。
奖励点:最终结果应该是每个形状一个简单(尽可能简单)的多边形。一些精度损失是可以的,实际上是鼓励的。多边形的线不必完全遵循等高线,允许有一些偏差以支持较少的点。
编辑:
我所说的“轮廓”是指:假设我有一个图像,上面画了一个矩形。我想找到的轮廓是构成矩形的四个点。这个正方形绘制的图像可以是任何图像。它可能是白色 Canvas 、风景画或肖像画,随您便。
我现在意识到点的顺序很重要。我必须能够重新绘制正方形,而不是以沙漏形状结束。
编辑 2:
我离使用 imagick 更近了一步。
convert img/modified.png img/original.png -compose ChangeMask -composite out.png
此命令使用原始版本作为修改版本的蒙版,并给我一张只有形状的图像。也许对于这张图片我可以使用标准的边缘检测算法。
一个持续存在的问题:它仅在图像中只有一种形状时才有效。但是,如果结果是我想的结果,那也没关系。
编辑 3:
我现在能够获得不太复杂形状的轮廓。但它会产生数百个点,这太多了。它应该被压缩到大约 20 个点。
过程如下:
最佳答案
Here是几个轮廓追踪算法的一个体面的演练。就个人而言,我使用了 Moore-neighborhood tracing算法 ( another link ) 具有良好的效果。我发现这是准确的,它保留了顺序,所以你不会遇到沙漏问题。
然而,在达到这一点之前,我通常必须进行一些预处理(morphological filters 或图像减法(如您所知))。
在这两个步骤之后,您应该有一个点集合。您有两个选择:
1) 复杂:将它们收集成向量。如果向量显着改变斜率(或方向),你就知道你有一个点。命令行工具,如 potrace可以做到这一点。 potrace 的算法是 here非常好。在您的简单矩形示例中,这将起作用,但它也适用于更复杂的场景,如圆形(您将只有很多矢量用于圆形)。
2) 简单:使用 Moore-Neigborhood 遍历您找到的像素并确定方向的变化。 (也就是说,如果三个像素排成一条线,而接下来的三个像素不是某个阈值 x 的“内联”,那么您就有一个角)。该算法适用于正方形,但对于更复杂的图像(例如八边形和圆形,其中线之间的角度增量更钝)开始分崩离析。
如果您所有的形状都足够简单(方形圆形等),您还可以考虑模板匹配(简单形状检测)。一个好的链接位于here在 Aforge 文档中。
关于php - 找到图像之间差异的轮廓,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17177496/
对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl
我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此
在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee
我正在检查一个Rails项目。在ERubyHTML模板页面上,我看到了这样几行:我不明白为什么不这样写:在这种情况下,||=和ifnil?有什么区别? 最佳答案 在这种特殊情况下没有区别,但可能是出于习惯。每当我看到nil?被使用时,它几乎总是使用不当。在Ruby中,很少有东西在逻辑上是假的,只有文字false和nil是。这意味着像if(!x.nil?)这样的代码几乎总是更好地表示为if(x)除非期望x可能是文字false。我会将其切换为||=false,因为它具有相同的结果,但这在很大程度上取决于偏好。唯一的缺点是赋值会在每次运行
我有带有Logo图像的公司模型has_attached_file:logo我用他们的Logo创建了许多公司。现在,我需要添加新样式has_attached_file:logo,:styles=>{:small=>"30x15>",:medium=>"155x85>"}我是否应该重新上传所有旧数据以重新生成新样式?我不这么认为……或者有什么rake任务可以重新生成样式吗? 最佳答案 参见Thumbnail-Generation.如果rake任务不适合你,你应该能够在控制台中使用一个片段来调用重新处理!关于相关公司
我正在学习http://ruby.railstutorial.org/chapters/static-pages上的RubyonRails教程并遇到以下错误StaticPagesHomepageshouldhavethecontent'SampleApp'Failure/Error:page.shouldhave_content('SampleApp')Capybara::ElementNotFound:Unabletofindxpath"/html"#(eval):2:in`text'#./spec/requests/static_pages_spec.rb:7:in`(root)'
我正在尝试使用Ruby2.0.0和Rails4.0.0提供的API从imgur中提取图像。我已尝试按照Ruby2.0.0文档中列出的各种方式构建http请求,但均无济于事。代码如下:require'net/http'require'net/https'defimgurheaders={"Authorization"=>"Client-ID"+my_client_id}path="/3/gallery/image/#{img_id}.json"uri=URI("https://api.imgur.com"+path)request,data=Net::HTTP::Get.new(path
2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p
📢博客主页:https://blog.csdn.net/weixin_43197380📢欢迎点赞👍收藏⭐留言📝如有错误敬请指正!📢本文由Loewen丶原创,首发于CSDN,转载注明出处🙉📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨文章预览:一.分辨率(Resolution)1、工业相机的分辨率是如何定义的?2、工业相机的分辨率是如何选择的?二.精度(Accuracy)1、像素精度(PixelAccuracy)2、定位精度和重复定位精度(RepeatPrecision)三.公差(Tolerance)四.课后作业(Post-ClassExercises)视觉行业的初学者,甚至是做了1~2年
如何找到调用此方法的位置?defto_xml(options={})binding.pryoptions=options.to_hifoptions&&options.respond_to?(:to_h)serializable_hash(options).to_xml(options)end 最佳答案 键入caller。这将返回当前调用堆栈。文档:Kernel#caller.例子[0]%rspecspec10/16|===================================================62=====