如何识别图片中不同颜色的区域

lqyyawq 2015-12-25 10:33:57
加精
例如下面这个图片。怎么样获取红色区域位置的坐标。假设实际图片中方块大小有偏差不是完全相同。



...全文
11216 17 打赏 收藏 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
图像腐蚀!直接缩小到中心点!然后提取就好了
pfc13260906009 2016-05-18
  • 打赏
  • 举报
回复
引用 14楼qq_33669630 的回复:
你这个问题没那么复杂。思路:两次循环,图像宽度一次,高度一次,分别查找黑色,就能算出纵横各有多少格,方格的坐标就有了。有了坐标,在每个坐标范围内各任取一行和一列循环取红色,结果就出来了。
中肯,算法性能得到了提升
qq_33669630 2016-01-08
  • 打赏
  • 举报
回复
更正一下,思路:两次循环,图像宽度一次,高度一次,分别查找黑色,就能算出纵横各有多少格,方格的坐标就有了。有了坐标,选坐标小的方格,本题水平格数小,在每个坐标范围内各任取一列循环取红色,结果就出来了。
qq_33669630 2016-01-07
  • 打赏
  • 举报
回复
你这个问题没那么复杂。思路:两次循环,图像宽度一次,高度一次,分别查找黑色,就能算出纵横各有多少格,方格的坐标就有了。有了坐标,在每个坐标范围内各任取一行和一列循环取红色,结果就出来了。
顾朋朋 2016-01-05
  • 打赏
  • 举报
回复
安卓手机端如何实现呢?
晒月光的青蛙 2016-01-04
  • 打赏
  • 举报
回复
引用 11 楼 qq_33582920 的回复:
opencv现在支持C#?
支持啊,搜索emgu
格拉 2015-12-31
  • 打赏
  • 举报
回复
可以参考floodfill算法
qq_33582920 2015-12-31
  • 打赏
  • 举报
回复
opencv现在支持C#?
Gagaga 2015-12-31
  • 打赏
  • 举报
回复
用DirectX
飞天凤凰601 2015-12-31
  • 打赏
  • 举报
回复
引用 6 楼 dotmonkey 的回复:
用opencv,现成算法.跟据绿色或蓝色分量,findContour直接得结果.
opencv现在支持C#?
dotmonkey 2015-12-30
  • 打赏
  • 举报
回复
用opencv,现成算法.跟据绿色或蓝色分量,findContour直接得结果.
zaianda 2015-12-26
  • 打赏
  • 举报
回复
支持!
引用 3 楼 bigbaldy 的回复:
[quote=引用 2 楼 lqyyawq 的回复:] 两个疑问,1、一个方块里面有很多像素,如何不重复计算坐标。 2、遍历所有像素会不会很慢。
1.就按像素读,读到一个红色的,后面还是红色就说明是同一个块,读到非红色之后又读到红色的,说明是一个新块,这个算法很简单,自己想就能搞定 2.遍历所有像素如果用默认的GetPixel方法会很慢,但如果用如下的GetPixel就没有任何性能问题

public class FastBitmap
{
    BitmapData bitmapData;
    public FastBitmap(Bitmap bitmap)
    {
        this.bitmapData=bitmap.LockBits(new Rectangle(0,0,bitmap.Width,bitmap.Height), System.Drawing.Imaging.ImageLockMode.ReadWrite, bitmap.PixelFormat);
    }
    public unsafe Color GetPixel(int x,int y)
    {
        if (bitmapData.PixelFormat == PixelFormat.Format32bppRgb || bitmapData.PixelFormat == PixelFormat.Format32bppArgb)
        {
            byte* numPtr = (byte*)((int)bitmapData.Scan0 + y * bitmapData.Stride + x * 4);
            return Color.FromArgb(numPtr[3],numPtr[2], numPtr[1],numPtr[0]);
        }
        if (bitmapData.PixelFormat == PixelFormat.Format24bppRgb)
        {
            byte* numPtr2 = (byte*)((int)bitmapData.Scan0 + y * bitmapData.Stride + x * 3);
            return Color.FromArgb(numPtr2[2], numPtr2[1], numPtr2[0]);
        }
        return Color.Empty;
    }
}
[/quote] 请问在C#里面要怎么做?
xuzuning 2015-12-25
  • 打赏
  • 举报
回复
指定颜色和容差,遍历每个像素 符合就记录坐标
bigbaldy 2015-12-25
  • 打赏
  • 举报
回复
引用 2 楼 lqyyawq 的回复:
两个疑问,1、一个方块里面有很多像素,如何不重复计算坐标。 2、遍历所有像素会不会很慢。
1.就按像素读,读到一个红色的,后面还是红色就说明是同一个块,读到非红色之后又读到红色的,说明是一个新块,这个算法很简单,自己想就能搞定 2.遍历所有像素如果用默认的GetPixel方法会很慢,但如果用如下的GetPixel就没有任何性能问题

public class FastBitmap
{
    BitmapData bitmapData;
    public FastBitmap(Bitmap bitmap)
    {
        this.bitmapData=bitmap.LockBits(new Rectangle(0,0,bitmap.Width,bitmap.Height), System.Drawing.Imaging.ImageLockMode.ReadWrite, bitmap.PixelFormat);
    }
    public unsafe Color GetPixel(int x,int y)
    {
        if (bitmapData.PixelFormat == PixelFormat.Format32bppRgb || bitmapData.PixelFormat == PixelFormat.Format32bppArgb)
        {
            byte* numPtr = (byte*)((int)bitmapData.Scan0 + y * bitmapData.Stride + x * 4);
            return Color.FromArgb(numPtr[3],numPtr[2], numPtr[1],numPtr[0]);
        }
        if (bitmapData.PixelFormat == PixelFormat.Format24bppRgb)
        {
            byte* numPtr2 = (byte*)((int)bitmapData.Scan0 + y * bitmapData.Stride + x * 3);
            return Color.FromArgb(numPtr2[2], numPtr2[1], numPtr2[0]);
        }
        return Color.Empty;
    }
}
lqyyawq 2015-12-25
  • 打赏
  • 举报
回复
引用 1 楼 xuzuning 的回复:
指定颜色和容差,遍历每个像素 符合就记录坐标
两个疑问,1、一个方块里面有很多像素,如何不重复计算坐标。 2、遍历所有像素会不会很慢。

111,128

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧