【问题标题】:Image processing - define selections from a source image图像处理 - 定义源图像的选择
【发布时间】:2010-06-29 04:27:03
【问题描述】:

例如,我有以下两张图片:

http://img571.imageshack.us/i/spain.jpg/
http://img97.imageshack.us/i/spainoverlay.png/

我想加载第二个并检测透明区域以用作我可以对其应用一些处理的选择,但我不知道如何开始。我熟悉加载图像并在其上绘制形状和文本,但仅此而已。

如何对透明区域进行某种“魔杖”检测,以获得一些点阵列或其他区域定义以进行操作?

编辑:在第二张图片中,白色区域实际上是透明区域。由于 imageshack 的背景颜色,它们显示为白色。

【问题讨论】:

    标签: c# image-processing


    【解决方案1】:

    这似乎是一个简单的问题,即只显示完整的地图图像,并将光标移动到该图像上时将光标坐标映射到掩码图像的相应坐标。你可以在这里做两件事。保持蒙版图像为黑白,并为每个区域生成一张地图,该地图与定义您在悬停该区域时要执行的操作相关联。或者,将您的蒙版更改为多色图像,然后简单地将每个颜色代码映射到定义您在该区域悬停时想要执行的操作。我个人会选择后者,因为它更简单,并且您将有大约 1600 万个可能的区域可以使用(给定 24 位颜色)。

    给定一个简单的映射类型:

    class ZoneMap
    {
        public Color MappedColor { get; set; }
        public Action OnHover { get; set; }
    }
    

    您可以通过将源图像的鼠标坐标转换为多色区域地图图像的相应坐标来查找映射区域,按颜色查找 ZoneMap 条目,并调用其 OnHover 操作:

    var spainZones = new ZoneMap[]
    {
        new ZoneMap { MappedColor = Color.Red, OnHover = new Action(RedHandler) },
        new ZoneMap { MappedColor = Color.Blue, OnHover = new Action(BlueHandler) }
    }
    
    var color = getZoneColor(Mouse.X, Mouse.Y); // translate source mouse coords to colored zone map coords and get color
    var zone = spainZones.FirstOrDefault(zm => zm.MappedColor == color);
    
    zone.OnHover();
    

    我知道这很粗糙。如果我有更多关于你想在特定区域悬停时做什么的信息,我可能会提供更多信息。

    【讨论】:

    • 这很接近我想要的,我想。基本思想是明确地处理各个区域(想想拼图)。最终结果类似于 warfish.net 处理他们的游戏地图的方式。我想向用户展示原始图像,检测点击,并对所有相同颜色的相邻像素做一些事情(例如,用颜色填充区域)
    • 我的意思是,根据叠加层使用相同颜色的相邻像素。原始源图像仅用于演示目的 - 目的是让叠加层定义图像的可操作区域。
    • @Chris:对,只会显示原始源图像。但是,只要您的源图像和区域地图图像的大小相同,您就可以在将鼠标悬停在源图像上时轻松地将鼠标坐标映射到区域地图图像。一旦你有了区域的颜色,通过颜色查找正确的 ZoneMap 条目,并调用它的 OnHover 动作,将是相当简单的。
    • 好的,我明白你在说什么,但是假设我想将映射到特定颜色的区域,并对其进行高斯模糊处理。我不担心此时的操作算法,但我将如何操作整个映射区域作为一个整体,而不是逐个像素地检查颜色?
    • 可能有多种方法。由于每个区域的 OnHover 动作都是独一无二的,您几乎可以做任何您想做的事情。如果您希望模糊悬停区域的区域,您可以加载另一张仅遮住您希望模糊的区域的图像,然后应用模糊算法。现在空间很便宜,所以我不会太担心使用单个蒙版图像来完成您想做的所有事情。分别解决每个问题。彩色蒙版解决了命中测试问题。独特的灰度蒙版可以解决模糊等问题。
    【解决方案2】:

    如果您使用 Bitmap 对象将图像加载到其中,您可以使用 Bitmap.GetPixel() 检查其 alpha 值(0 表示完全透明,255 表示完全不透明)来检查像素是否透明。

    如果您只需要对每个透明像素做一些事情,我想没有必要在单独的对象中创建选择。只需遍历像素,如果一个是透明的,做你必须做的。

    如果您确实需要创建选区,则可以使用与原始图像大小相同的单独的每像素 1 位位图。白色代表选定区域,黑色未选定(或相反,您的选择)。

    见: http://msdn.microsoft.com/en-us/library/system.drawing.bitmap.aspx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 2023-04-05
      • 2018-07-05
      • 1970-01-01
      • 2013-09-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多