C# 查找图像某些区域内的黑色块的坐标值

在一个100*900的24位彩色图像的区域内,有不定数量的长宽已知的黑色块,如何通过程序的方式识别出来,并将开始点的坐标记录下来。最好是有源代码!小弟也是第一次接触用C#... 在一个100*900的24位彩色图像的区域内,有不定数量的长宽已知的黑色块,如何通过程序的方式识别出来,并将开始点的坐标记录下来。
最好是有源代码!小弟也是第一次接触用C#来处理图像。

万分感谢 ,谢谢!
色块之间是不会有重叠的,是分开有一定的距离。
展开
 我来答
魔法软糖™
2016-12-05 · TA获得超过837个赞
知道小有建树答主
回答量:822
采纳率:94%
帮助的人:144万
展开全部

软糖花了好长时间才弄好,主要是Color之间不能直接比较,要先转化ToArgb()。

坐标从 矩形集合[n].X ,矩形集合[n].Y 中获取。

如果有重叠部分,可能会不准确,有时候多一块,未能排除此BUG

窗体上有两个控件 picturebox1,位于顶部 width = 900 height= 100

button1有个click事件用来演示搜索。

上代码

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        int 色块宽=10;
        int 色块高=10;
        Random rnd = new Random();
        Color black = Color.Black;
        Brush brush;
        Bitmap 图像;
        List<Rectangle> 矩形集合 = new List<Rectangle>();
        private void 搜索色块()
        {
            int ARGB值 = black.ToArgb();
            for (int x = 0; x < 900; x++)
            {
                for (int y = 0; y < 100; y++)
                {
                    bool b = false;
                    //如果坐标X,Y不在任何集合中的矩形范围内,在进行判断
                    foreach (var rect in 矩形集合)
                    {
                        if (rect.Contains(x, y)) { b = true; }
                    }
                    if (b == false)
                    {
                        //取色,并转化为ARGB值比较,如果是黑色,就把这个矩形加入列表
                        //Color比较还要比对颜色名称,即使ARGB分量完全相同,颜色名称不同比较结果也是不等。
                        if (图像.GetPixel(x, y).ToArgb() == ARGB值)
                        { 矩形集合.Add(new Rectangle(x, y, 色块宽+1, 色块高+1)); }
                    }
                }

            }
            //遍历矩形集合,获取坐标: 矩形集合[n].Location
            button1.Text = string.Format("{0}",矩形集合.Count);
        }
        private void 绘制色块()
        {
            图像 = new Bitmap(900, 100);
            brush = new SolidBrush(black);
            Graphics g = Graphics.FromImage(图像);
            for (int i = 1; i <= 19; i++)
            {
                int x = rnd.Next(1, 900 - 色块宽);
                int y = rnd.Next(1, 100 - 色块高);
                g.FillRectangle(brush, x, y, 色块宽, 色块高);
            }
        }

        private void Form1_Click(object sender, EventArgs e)
        {
            绘制色块();
            pictureBox1.Image = 图像;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            搜索色块();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
    }


如满意,请采纳,谢谢。

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式