(图象识别)getPixel的效率慢, 有没有其他的高效方法!

时间:2022-05-04 06:25:35
我现在做图象识别这块,我用getPixel 和 setPixel发放来处理Bitmap图像,如果放到线程里面批量处理大量图片的话就会很慢!有没有其他的方法改进?

例如:

          //把图象变成单色的图
          public void singlBmp(Bitmap bit)
          {

            Color c = new Color();
            Color cc = new Color();
            int rr, gg, bb;

            for (int i = 0; i < bit.Width; i++)
            {
                for (int j = 0; j <bit.Height; j++)
                {
                    c = bit.GetPixel(i, j);
                    rr = rrIn[c.R];


                    cc = Color.FromArgb(rr, rr, rr);
                    bit.SetPixel(i, j, cc);
                }
            }
        }
        //如果放到线程里面会很卡,处理的很慢

7 个解决方案

#1


我所知道的图象处理和识别,很少直接用Bitmap类,或者说很多用自己的数据结构,比如OpenCV用cvImage。

如果要一定要用Bitmap类,可以用Bitmap.LockBits来拿到BitmapData数据后自己处理。
Bitmap.GetPixel是个通用的函数,它的确非常的慢。

#2


不了解 顶顶再说

#3


学习帮顶

#4


给你写一个吧。。。。。。
右击解决方案,生成里面,勾选上 允许不安全代码。。。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

using System.Drawing.Imaging;
namespace neicun
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Bitmap m_Bmp = new Bitmap("d:\\nvhai.bmp");
            int h = m_Bmp.Height;
            int w = m_Bmp.Width;

            Bitmap bmpOut = new Bitmap(w, h, PixelFormat.Format24bppRgb);

            BitmapData dataIn = m_Bmp.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
            BitmapData dataOut = bmpOut.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

            unsafe
            {
                byte* pIn = (byte*)(dataIn.Scan0.ToPointer());
                byte* pOut = (byte*)(dataOut.Scan0.ToPointer());

                for (int y = 0; y < dataIn.Height; y++)
                {
                    for (int x = 0; x < dataIn.Width; x++)
                    {

                        pOut[1] = pOut[0];
                        pOut[2] = pOut[0];

                        pIn += 3;
                        pOut += 3;
                    }

                    pIn += dataIn.Stride - dataIn.Width * 3;
                    pOut += dataOut.Stride - dataOut.Width * 3;
                }
            }

            bmpOut.UnlockBits(dataOut);
            m_Bmp.UnlockBits(dataIn);
            pictureBox1.Image = bmpOut;
        }
    }
}

#5


up

#6


引用 4 楼 wjwu1988 的回复:
给你写一个吧。。。。。。 
右击解决方案,生成里面,勾选上 允许不安全代码。。。 

C# codeusing System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

using System.Drawing.Imaging;
namespace neicun
{
    public partial class Form1 : Form
    {
        public Form1()
        {
 …


有一点你错了:
                    for (int x = 0; x < dataIn.Width; x++)
                    {
                        pOut[0] = pIn[0];
                        pOut[1] = pIn[0];
                        pOut[2] = pIn[0];

                        pIn += 3;
                        pOut += 3;
                    }


#7


如果不使用不安全代码

可以使用

然后使用System.Runtime.InteropServices.Marshal.Copy 把数据复制出来

#1


我所知道的图象处理和识别,很少直接用Bitmap类,或者说很多用自己的数据结构,比如OpenCV用cvImage。

如果要一定要用Bitmap类,可以用Bitmap.LockBits来拿到BitmapData数据后自己处理。
Bitmap.GetPixel是个通用的函数,它的确非常的慢。

#2


不了解 顶顶再说

#3


学习帮顶

#4


给你写一个吧。。。。。。
右击解决方案,生成里面,勾选上 允许不安全代码。。。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

using System.Drawing.Imaging;
namespace neicun
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Bitmap m_Bmp = new Bitmap("d:\\nvhai.bmp");
            int h = m_Bmp.Height;
            int w = m_Bmp.Width;

            Bitmap bmpOut = new Bitmap(w, h, PixelFormat.Format24bppRgb);

            BitmapData dataIn = m_Bmp.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
            BitmapData dataOut = bmpOut.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

            unsafe
            {
                byte* pIn = (byte*)(dataIn.Scan0.ToPointer());
                byte* pOut = (byte*)(dataOut.Scan0.ToPointer());

                for (int y = 0; y < dataIn.Height; y++)
                {
                    for (int x = 0; x < dataIn.Width; x++)
                    {

                        pOut[1] = pOut[0];
                        pOut[2] = pOut[0];

                        pIn += 3;
                        pOut += 3;
                    }

                    pIn += dataIn.Stride - dataIn.Width * 3;
                    pOut += dataOut.Stride - dataOut.Width * 3;
                }
            }

            bmpOut.UnlockBits(dataOut);
            m_Bmp.UnlockBits(dataIn);
            pictureBox1.Image = bmpOut;
        }
    }
}

#5


up

#6


引用 4 楼 wjwu1988 的回复:
给你写一个吧。。。。。。 
右击解决方案,生成里面,勾选上 允许不安全代码。。。 

C# codeusing System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

using System.Drawing.Imaging;
namespace neicun
{
    public partial class Form1 : Form
    {
        public Form1()
        {
 …


有一点你错了:
                    for (int x = 0; x < dataIn.Width; x++)
                    {
                        pOut[0] = pIn[0];
                        pOut[1] = pIn[0];
                        pOut[2] = pIn[0];

                        pIn += 3;
                        pOut += 3;
                    }


#7


如果不使用不安全代码

可以使用

然后使用System.Runtime.InteropServices.Marshal.Copy 把数据复制出来