Эквализация гистограммы изображения - C#

Узнай цену своей работы

Формулировка задачи:

В результате эквализации гистограммы на носу появляются черные пятна. Где косяк?)
public Bitmap equalizing(Bitmap bmp)
        {
            Rectangle rect = new Rectangle(0, 0, Bmp.Width, Bmp.Height);
            System.Drawing.Imaging.BitmapData bmpData = Bmp.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, Bmp.PixelFormat);
            IntPtr ptr = bmpData.Scan0;
            int bytes = bmpData.Stride * Bmp.Height;
            byte[] grayValues = new byte[bytes];
            int[] R = new int[256];
            byte[] N = new byte[256];
            byte[] left = new byte[256];
            byte[] right = new byte[256];
            System.Runtime.InteropServices.Marshal.Copy(ptr, grayValues, 0, bytes);
            
            for (int i=0; i<grayValues.Length; i++)
            {
                ++R[grayValues[i]];
            }
 
            byte z=0;
            int Hint=0;
            int Havg = grayValues.Length / R.Length;
            for (int i = 0; i < N.Length-1; i++)
            {
                N[i] = 0;
            }
            for (int j = 0; j < R.Length; j++)
            {
                left[j] = z;
                Hint += R[j];
                while (Hint > Havg)
                {
                    Hint -= Havg;
                    z++;
                }
                right[j] = z;
                N[j] =(byte) ((left[j] + right[j]) / 2);
            }
           for (int i = 0; i<grayValues.Length; i++)
           {
               if (left[grayValues[i]] == right[grayValues[i]]) grayValues[i] = (byte)left[grayValues[i]];
               else grayValues[i] = (byte)N[grayValues[i]];
          }
 
            System.Runtime.InteropServices.Marshal.Copy(grayValues, 0, ptr, bytes);
            Bmp.UnlockBits(bmpData);
            return Bmp;
        }

Решение задачи: «Эквализация гистограммы изображения»

textual
Листинг программы
        private void эквализацияГистограммыToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (Bmp == null) mesBoxDownloadError();
            else
            {
                equalizing(Bmp);
                pictureBox1.Image = (Bitmap)Bmp;
                Bitmap copy = new Bitmap(Bmp);
                copy = Bmp.Clone(new Rectangle(0, 0, Bmp.Width, Bmp.Height), Bmp.PixelFormat);
                bmstackz.Push(copy);
                bmstackr.Clear();
            }
        }
        public Bitmap equalizing(Bitmap bmp)
        {
            Rectangle rect = new Rectangle(0, 0, Bmp.Width, Bmp.Height);
            System.Drawing.Imaging.BitmapData bmpData = Bmp.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, Bmp.PixelFormat);
            IntPtr ptr = bmpData.Scan0;
            int bytes = bmpData.Stride * Bmp.Height;
            byte[] grayValues = new byte[bytes];
            int[] R = new int[256];
            byte[] N = new byte[256];
            byte[] left = new byte[256];
            byte[] right = new byte[256];
            System.Runtime.InteropServices.Marshal.Copy(ptr, grayValues, 0, bytes);
            for (int i=0; i<grayValues.Length; i++) ++R[grayValues[i]];
            int z=0;
            int Hint=0;
            int Havg = grayValues.Length / R.Length;
            for (int i = 0; i < N.Length-1; i++)
            {
                N[i] = 0;
            }
            for (int j = 0; j < R.Length; j++)
            {
                if (z > 255) left[j] = 255;
                else left[j] = (byte)z;
                Hint += R[j];
                while (Hint > Havg)
                {
                    Hint -= Havg;
                    z++;
                }
                if (z > 255) right[j] = 255;
                else right[j] = (byte)z;
                
                N[j] =(byte) ((left[j] + right[j]) / 2);
            }
           for (int i = 0; i<grayValues.Length; i++)
           {    
                if (left[grayValues[i]] == right[grayValues[i]]) grayValues[i] = left[grayValues[i]];
                else grayValues[i] = N[grayValues[i]];
          }
 
            System.Runtime.InteropServices.Marshal.Copy(grayValues, 0, ptr, bytes);
            Bmp.UnlockBits(bmpData);
            return Bmp;
        }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 3.7 из 5
Похожие ответы