关于图像二值化处理的问题

时间:2021-06-18 06:15:10
我设置了一个按钮用来改变图片的正反相,左侧的Pic1是加载并显示原图,右侧的Pic2是用来显示二值化后的图片
按钮点击代码如下:
//设置正反相图标
        int lr; //判断按钮状态
        private void LR_Pic_Click(object sender, EventArgs e)
        {
            Bitmap img1 = (Bitmap)Pic1.Image;

            if (this.Pic1.Image != null)
            {
                Color cc = img1.GetPixel(0, 0);
                MessageBox.Show(cc.ToString());

                if (lr == 0)
                {
                    LR_Pic.Image = global::识字体_Windows_.Properties.Resources.反相图标;
                    this.Pic2.Image = null;
                    this.Pic2.Image = ConvertTo1Bpp2(img1);
                    MessageBox.Show("1");
                    lr = 1;
                }
                else
                {
                    LR_Pic.Image = global::识字体_Windows_.Properties.Resources.正相图标;
                    this.Pic2.Image = null;
                    this.Pic2.Image = ConvertTo1Bpp1(img1);
                    MessageBox.Show("2");
                    lr = 0;
                }
            }
            else
            {
                if (lr == 0)
                {
                    LR_Pic.Image = global::识字体_Windows_.Properties.Resources.反相图标;
                    lr++;
                }
                else
                {
                    LR_Pic.Image = global::识字体_Windows_.Properties.Resources.正相图标;
                    lr--;
                }
            }
        }

正反相的代码如下:

//图像二值化(正相)
        public Bitmap ConvertTo1Bpp1(Bitmap bmp)
        {
            int average;

            average = this.trackBar1.Value;

            for (int i = 0; i < bmp.Width; i++)
            {
                for (int j = 0; j < bmp.Height; j++)
                {
                    //获取该点的像素的RGB的颜色 
                    Color color = bmp.GetPixel(i, j);
                    int value = color.B;
                    Color newColor = value > average ? Color.FromArgb(0, 0, 0) : Color.FromArgb(255, 255, 255);
                    bmp.SetPixel(i, j, newColor);
                }
            }
            return bmp;
        }
        //图像二值化(反相)
        public Bitmap ConvertTo1Bpp2(Bitmap bmp)
        {
            int average;

            average = this.trackBar1.Value;

            for (int i = 0; i < bmp.Width; i++)
            {
                for (int j = 0; j < bmp.Height; j++)
                {
                    //获取该点的像素的RGB的颜色 
                    Color color = bmp.GetPixel(i, j);
                    int value =color.B;
                    Color newColor = value > average ? Color.FromArgb(255, 255, 255) : Color.FromArgb(0, 0, 0);
                    bmp.SetPixel(i, j, newColor);
                }
            }
            return bmp;
        }

然后问题来了,第一次点击按钮和第二次点击按钮的时候,都没问题。包括弹窗提示也正常,但是从第三次点击开始,变成了每点击两次 Pic2 才会换一次图片,但是弹窗的1和2显示依旧正常。

关于图像二值化处理的问题

  小白求助,问题究竟出在哪了? 关于图像二值化处理的问题

5 个解决方案

#1


你没有发觉原图也变色了吗,Bitmap img1 = (Bitmap)Pic1.Image;并没有产生一张图片的副本,而是直接指向你的原图,你在做转换的时候原图一起被转换了

#2


0 0 这个我倒是没注意到,因为原图一直没变过, 求指教,怎么破。 关于图像二值化处理的问题

#3


Quote: 引用 2 楼 d8867820 的回复:

0 0 这个我倒是没注意到,因为原图一直没变过, 求指教,怎么破。
对原图做个copy,或者原图只用于计算,而二值化的结果写入一张新图相同位置

#4


定义一个 空的图片  附上原图的值   把这个图片用于计算

#5


把原图先保存起来,每次转换的时候拿原图来转换

#1


你没有发觉原图也变色了吗,Bitmap img1 = (Bitmap)Pic1.Image;并没有产生一张图片的副本,而是直接指向你的原图,你在做转换的时候原图一起被转换了

#2


0 0 这个我倒是没注意到,因为原图一直没变过, 求指教,怎么破。 关于图像二值化处理的问题

#3


Quote: 引用 2 楼 d8867820 的回复:

0 0 这个我倒是没注意到,因为原图一直没变过, 求指教,怎么破。
对原图做个copy,或者原图只用于计算,而二值化的结果写入一张新图相同位置

#4


定义一个 空的图片  附上原图的值   把这个图片用于计算

#5


把原图先保存起来,每次转换的时候拿原图来转换