霍夫变换 C# 代码 [关闭]

2023-12-25

让我们看一下这个 C# 实现 https://github.com/andrewkirillov/AForge.NET/blob/a9453dad025d1fbffab165293cedc976187da535/Sources/Imaging/HoughLineTransformation.cs#L457,

        ... ...

        // get source image size
        int width       = image.Width;
        int height      = image.Height;
        int halfWidth   = width / 2;
        int halfHeight  = height / 2;

        // make sure the specified rectangle recides with the source image
        rect.Intersect( new Rectangle( 0, 0, width, height ) );

        int startX = -halfWidth  + rect.Left;
        int startY = -halfHeight + rect.Top;
        int stopX  = width  - halfWidth  - ( width  - rect.Right );
        int stopY  = height - halfHeight - ( height - rect.Bottom );

        int offset = image.Stride - rect.Width;

        // calculate Hough map's width
        int halfHoughWidth = (int) Math.Sqrt( halfWidth * halfWidth + halfHeight * halfHeight );
        int houghWidth = halfHoughWidth * 2;

        houghMap = new short[houghHeight, houghWidth];

        // do the job
        unsafe
        {
            byte* src = (byte*) image.ImageData.ToPointer( ) +
                rect.Top * image.Stride + rect.Left;

            // for each row
            for ( int y = startY; y < stopY; y++ )
            {
                // for each pixel
                for ( int x = startX; x < stopX; x++, src++ )
                {
                    if ( *src != 0 )
                    {
                        // for each Theta value
                        for ( int theta = 0; theta < houghHeight; theta++ )
                        {
                            int radius = (int) Math.Round( cosMap[theta] * x - sinMap[theta] * y ) + halfHoughWidth;

                            if ( ( radius < 0 ) || ( radius >= houghWidth ) )
                                continue;

                            houghMap[theta, radius]++;
                        }
                    }
                }
                src += offset;
            }
        }

        ... ... ...

Q.1. rect.Intersect(new Rectangle( 0, 0, width, height));- 为什么这条线很重要?

Q.2. 为什么使用修改值rect在下面的代码中:

int startX = -halfWidth  + rect.Left;
int startY = -halfHeight + rect.Top;
int stopX  = width  - halfWidth  - ( width  - rect.Right );
int stopY  = height - halfHeight - ( height - rect.Bottom );

Q.3. 为什么 y 和 x 循环从负点开始?


Q.1.

这条线只是确保边界矩形完全位于图像内部。如果你要跳过这个,并且rect(部分)在图像之外,您最终会索引超出范围。

请注意,像素访问是通过指针完成的,每个 x 增量将指针增加 1,并且offset对于每个 y 增量。如果rect比图像大,我们会将指针增加到图像缓冲区之外。如果rect只是移出图像边界,但不是太大,我们会读取与我们正在使用的坐标不对应的像素。

Q.2.

注意

int stopX  = width  - halfWidth  - ( width  - rect.Right );
int stopY  = height - halfHeight - ( height - rect.Bottom );

可以简化为

int stopX  = - halfWidth  + rect.Right;
int stopY  = - halfHeight + rect.Bottom;

该代码定义了图像中间坐标系的原点。这段代码移动了边界框(最初定义在 [0,width) 和 [0,height) ) 到新的坐标系。

通常霍夫变换是用左上角像素中的原点定义的。但原则上,坐标系如何定义并不重要,这只是修改直线的参数化。为每个输入像素绘制的正弦曲线将有所不同,但与图像中的线条相对应的参数集仍会出现局部最大值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

霍夫变换 C# 代码 [关闭] 的相关文章

  • C# 中直接从 URL 获取图像尺寸

    我正在尝试使用以下代码直接从网络上获取图片的尺寸 string image http www hephaestusproject com csharp3 png byte imageData new WebClient DownloadDa
  • 显示 div 内的用户名列表

    我是 jQuery 新手 在我的项目中 我创建了一个类User其中代码如下所示 static ConcurrentDictionary
  • 如何使用最小起订量模拟私有只读 IList 属性

    我试图嘲笑这个列表 private readonly IList
  • 无需登录即可在 Intranet 上获取 Web 应用程序的域\用户名

    我的 Intranet 上有一个 Web 应用程序 VS 2005 有几个页面不需要用户登录应用程序 反馈和默认页面 我正在尝试获取要显示和 或发送反馈的域名和用户名 有没有一种方法可以在不需要用户登录的情况下执行此操作 我试过了this
  • BufferBlock 连续

    我想使用以下方式实现消费者 生产者模式BufferBlock
  • C++0x 初始值设定项列表示例

    我想看看这个现有代码示例如何利用 C 0x 初始化列表功能 示例0 include
  • JetBrains Rider 针对 4.5 框架,无法切换到 4.7

    基本上 当尝试添加不支持旧框架的 NuGet 包时 会出现错误 但是在项目配置中只有 4 5 可用 在项目创建过程中 不存在选择目标的选项 有什么方法可以正确配置它吗 I haven t found out how to set up NE
  • 当 foreach 块的内容具有 Conditional 属性时,C# 编译器是否会对其进行优化?

    我正在工作中编写一些调试代码 我想知道我所做的是否会损害性能 让我们看一下代码 foreach var item in aCollection Debug WriteLine item Name 我知道 Debug 类使用 Conditio
  • 使用默认行为将模型绑定到接口

    我正在尝试将控制器操作绑定到接口 但仍保持默认的绑定行为 public class CoolClass ISomeInterface public DoSomething get set ISomeInterface public clas
  • += 运算符在 C++ 中是如何实现的?

    这是我一直在思考的一个问题 但从未找到任何资源来说明这个问题的答案 事实上它不仅是为了 也适用于它的兄弟姐妹 即 等等 当然不是 考虑这个例子 int a 5 a 4 this will make a 9 现在考虑等效表达式 a a 4 T
  • 根据 Active Directory 策略检查密码[重复]

    这个问题在这里已经有答案了 我有一个允许用户更改其 AD 密码的前端 有没有办法获取特定用户及其属性 长度 复杂性 的密码策略 例如细粒度 有没有办法根据此特定策略检查字符串 xyz121 编辑 我不想检查活动目录中存储的当前密码 我想检查
  • 主构造函数不再在 VS2015 中编译

    直到今天 我可以使用主构造函数 例如 public class Test string text private string mText text 为了能够做到这一点 在以前的 Visual Studio CTP 中 我必须将其添加到 c
  • 重定向 std::cout

    我需要一个类 在其对象的生命周期内将一个 ostream 重定向到另一个 ostream 经过一番修补后 我想出了这个 include
  • 这些工作队列标志意味着什么?

    在研究工作队列时 我遇到了内核中定义的工作队列标志和常量 我有以下我无法理解的疑问 这里的排水和救援到底是什么意思 WQ DRAINING 1 lt lt 6 internal workqueue is draining WQ RESCUE
  • 如果项目包含多个文件夹,如何使用 Add-Migration

    我想Add Migration使用我的 DbContext 但出现错误 The term add migration is not recognized as the name of a cmdlet function script fil
  • 使用 WinAPI 连接禁用的显示设备

    我的问题是启用禁用的监视器ChangeDisplaySettingsEx 我想这不是火箭科学 但经过一番挖掘后 它看起来仍然是不可能的 我找到了一种根据找到的 Microsoft 代码示例禁用所有辅助显示器的方法here https msd
  • 按 Enter 继续

    这不起作用 string temp cout lt lt Press Enter to Continue cin gt gt temp cout lt lt Press Enter to Continue cin ignore 或更好 in
  • 使用方法的状态模式

    我正在尝试使用方法作为状态而不是类来基于状态模式的修改版本来实现一个简单的状态机 如下所示 private Action
  • 在两个点之间创建一条曲线,每个点都具有标准化向量

    因此 我需要一种写入方法来在两点之间创建一条曲线 每个点都有一个指向任意方向的归一化向量 我一直在尝试设计这样一种方法 但一直无法理解数学 在这里 由于一张图片胜过一千个文字 这就是我所需要的 在图中 矢量垂直于红线 我相信向量需要进行相同
  • 是否可以检测流是否已被客户端关闭?

    简要介绍一下情况 我有一项服务可以通过套接字接收信息并发送回复 连接不安全 我想设置另一个可以为这些连接提供 TLS 的服务 这个新服务将提供单个端口并根据提供的客户端证书分发连接 我不想使用 stunnel 有几个原因 其中之一是每个接收

随机推荐

  • 参数 1 必须是 pygame.surface,而不是 list

    我正在编写一个小型 Python 游戏 但我的一些代码似乎不起作用 看一看 import pygame import sys import pygame sprite as sprite import time pygame init py
  • 内部类。它的目的是什么?

    有人能告诉我内部类的目的是什么吗 我可以想到一些 但可能它们不是使用内部类的充分理由 我的理由是 当您想要使用其他类无法使用的类时 内部类会很有帮助 还有什么 当我学习 Java 时 我们使用内部类来处理 GUI 事件处理类 它是一种 一次
  • 使用 GDIPlus (WIn32 C++) 显示存储为带 alpha 资源的图标

    我有一个带有部分 alpha alpha 值在 0 到 255 之间 的图标 我想使用 GDIPlus 显示该图标 当使用采用直接文件名的 GDI 位图构造函数时 文件可以正确显示 然而 当从资源加载时 它在识别 alpha 时遇到问题 我
  • openpyxl 合并单元格:格式问题

    假设我有一个 xlsx 文件 并且该 Excel 文件合并了单元格 A2 和 B2 我还选择该合并单元格 并在合并单元格的顶部和底部放置边框 当我执行以下操作时 wb openpyxl load workbook file xlsx wb
  • 未解析的对象 [INFORMATION_SCHEMA] 引用。[表]

    我创建了一个 UDF 来访问 INFORMATION SCHEMA TABLES view CREATE FUNCTION dbo CountTables name sysname RETURNS INT AS BEGIN RETURN S
  • data.table::fread 一个 `integer64` 类型,仅手动重写一列的 colClass

    我有一个 csv 其中一列 ID 包含一个带有前导零的长整数 fread将其转换为integer64类型 我如何指定一列的类 然后让fread自动猜测剩余列的类 不确定这是否是一种 全有或全无 的情况 我有 50 多列 并且不想仅仅因为必须
  • Storybook 全局 Scss 变量

    CLI 工具 故事书 框架 Vue Nuxt 问题 我试图将全局 SCSS 变量引入 Storybook Stories 以便它们以与 Nuxt 中相同的方式运行组件 我已经尝试使用 sass resources loader 进行自定义
  • 在 Ansible 中组合多个循环的输出

    我正在使用 Ansible 在我的剧本中运行以下任务 其中有多个循环 以便从特定 xml 检索不同的标签 name Retrieve multiple xml tags valuei xml xmlstring item string xp
  • 如何在Gradle中使用pom类型依赖

    我需要从我的 pom java 库中生成传递依赖 这是我如何做的一个例子 plugins java library maven publish repositories some maven repo dependencies This i
  • 给定一些移动规则,如何枚举从棋盘左下角(a1)方块开始到达右上角(h8)方块的唯一路径?

    几周前 我被要求找到所有不同且独特的方法来到达棋盘的右上角 其中 x y gt 3 从 0 0 开始 知道你只能增加 x 和 y通过 1 我仍然无法找到可以解释如何在棋盘上导航的算法 所以我想知道你们是否有什么可以推荐的 换句话说 您会如何
  • 活动预订不会重新安排/取消

    我可以使用 gMail 标记安排活动 但是 如果我尝试重新安排活动 它只会在新时间制作第二个副本 并保持原始活动不变 如果我尝试取消某个活动 则什么也不会发生 我的确认示例如下 div div div div
  • Android 共享首选项不起作用

    我有一项服务 其中有4个全局静态int变量我有一个启动完成和呼叫事件的接收器 我想做的是每当执行 Call 事件接收器时保存这 4 个变量 并在执行 BOOT 接收器时检索它们 当然当我重新启动手机时 但两者都不起作用 另一件事设备重新启动
  • Powershell使用ODBC DSN而不是连接字符串从数据库读取

    我知道如何使用连接字符串从数据库读取值 即 建立数据库连接进行读取 conn New Object System Data SqlClient SqlConnection conn ConnectionString Server 10 10
  • GitHub Pages:如何将文本环绕在图像周围?

    我有一个 GitHub 博客页面 在博客页面中间的某个位置 我有一张图像 其中显示了以下 Markdown 内容 My Image pathto myimage png 这可以很好地显示图像 但我还想添加一个段落 包裹在图像的右侧 来描述图
  • bigquery 使用嵌套字段进行旋转

    我有一个带有架构的 bigquery 表 我想要这样的结果 flow timestamp channel name number of digits 2019 10 31 15 31 15 channel name 1 3 2019 10
  • Azure AD 在有效访问令牌上返回 Authentication_ExpiredToken

    我越来越Your access token has expired Please renew it before submitting the request 当我打电话时https graph windows net myorganiza
  • frisby 的 Get 方法不适用于 https

    我是弗里斯比测试的新手 今天发现无法访问https ip https ip来自 friby api 的地址 例如 frisby create my test get https 199 59 148 20 output connect er
  • Eclipse/MySQL 集成插件? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 我的顺风滚动 snap x 无法工作,您能找到解决方案吗?

    所以我使用 Tailwind CSS 但遇到了问题 所以我正在学习如何在顺风 CSS 上进行滚动捕捉 滚动对齐 y 有效 但滚动对齐 x 不起作用 我尝试了一切让我的代码滚动 snap x 但它不起作用 你们中的任何人都可以修复我的顺风代码
  • 霍夫变换 C# 代码 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 让我们看一下这个 C 实现 https github com andrewkirillov AForge NET blob a9453