示例#1
0
        private void ButtonOpenImage_Click(object sender, EventArgs e)
        {
            Stream         streamImage       = null;
            OpenFileDialog ImageSourceDialog = new OpenFileDialog();

            if (ImageSourceDialog.ShowDialog() == DialogResult.OK)
            {
                try
                {
                    if ((streamImage = ImageSourceDialog.OpenFile()) != null)
                    {
                        using (streamImage)
                        {
                            using (var bmpTemp = new Bitmap(ImageSourceDialog.FileName))
                            {
                                OriginalImage = new Bitmap(bmpTemp);
                                CopyImage     = OriginalImage;
                                if (!janelaAberta)
                                {
                                    imagemOriginal = new ImagemOriginal();
                                    imagemOriginal.Show();
                                    imagemOriginal.updateImage(OriginalImage);
                                    imagemCopia = new ImagemOriginal();
                                    imagemCopia.Show();
                                    imagemCopia.updateImage(CopyImage);
                                    imagemCopia.Text = "Copia da imagem";

                                    janelaAberta = true;
                                }
                                else
                                {
                                    imagemOriginal.updateImage(OriginalImage);
                                    imagemCopia.updateImage(CopyImage);
                                }
                            }
                            streamImage.Dispose();
                        }
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
        }
示例#2
0
        private void Equalization()
        {
            //inicialização do lockbits para poder alterar brilho
            Bitmap     tempImage     = new Bitmap(CopyImage);
            BitmapData TempImageData = tempImage.LockBits(new Rectangle(0, 0, tempImage.Width, tempImage.Height), ImageLockMode.ReadWrite, tempImage.PixelFormat);
            IntPtr     ptrImage      = TempImageData.Scan0;                               //ponteiro do inicio da imagem
            int        bytes         = Math.Abs(TempImageData.Stride) * tempImage.Height; //quantidade de bytes na imagem

            byte[] imgArrayFinal = new byte[bytes];                                       //array com os bytes da imagem
            Marshal.Copy(ptrImage, imgArrayFinal, 0, bytes);

            float alfa = 255;

            alfa = alfa / (imgArrayFinal.Length / 4);
            int pixel = 0, pixelR = 0, pixelG = 0, pixelB = 0;

            int[] histograma, histograma_acumulado, histogramaR, histogramaG, histogramaB, histogramaRacumulado, histogramaGacumulado, histogramaBacumulado;
            int[] histogramaPosicao = new int[imgArrayFinal.Length / 4];
            int   index             = 0;

            histograma = histograma_acumulado = histogramaR = histogramaG = histogramaB = histogramaRacumulado = histogramaGacumulado = histogramaBacumulado = new int[256];

            if (ColorCheck().colored)
            {
                for (int pos = 0; pos < imgArrayFinal.Length; pos += 4)         //calcula histograma para cada canal
                {
                    pixelR = imgArrayFinal[pos];
                    pixelG = imgArrayFinal[pos + 1];
                    pixelB = imgArrayFinal[pos + 2];
                    histogramaR[pixelR]      = histogramaR[pixelR] + 1;
                    histogramaG[pixelG]      = histogramaG[pixelG] + 1;
                    histogramaB[pixelB]      = histogramaB[pixelB] + 1;
                    histogramaPosicao[index] = pixelR;
                    index++;
                }

                //necessario uma variavel auxiliar pois estava passando como 0 se feita a multiplicação direta
                float auxR = alfa * histogramaR[0];
                float auxG = alfa * histogramaG[0];
                float auxB = alfa * histogramaB[0];
                histogramaRacumulado[0] = (int)auxR;
                histogramaGacumulado[0] = (int)auxG;
                histogramaBacumulado[0] = (int)auxB;

                for (int pos = 1; pos < histogramaR.Length; pos++)
                {
                    auxR = histogramaRacumulado[pos - 1] + alfa * histogramaR[pos];
                    auxG = histogramaGacumulado[pos - 1] + alfa * histogramaG[pos];
                    auxB = histogramaBacumulado[pos - 1] + alfa * histogramaB[pos];
                    histogramaRacumulado[pos] = (int)auxR;
                    histogramaGacumulado[pos] = (int)auxG;
                    histogramaBacumulado[pos] = (int)auxB;
                }

                index = 0;
                for (int pos = 0; pos < imgArrayFinal.Length; pos += 4)
                {
                    imgArrayFinal[pos]     = (byte)histogramaRacumulado[histogramaPosicao[index]];
                    imgArrayFinal[pos + 1] = (byte)histogramaGacumulado[histogramaPosicao[index]];
                    imgArrayFinal[pos + 2] = (byte)histogramaBacumulado[histogramaPosicao[index]];
                    index++;
                }
            }
            else
            {
                for (int pos = 0; pos < imgArrayFinal.Length; pos += 4)         //calcula histograma
                {
                    pixel                    = imgArrayFinal[pos];
                    histograma[pixel]        = histograma[pixel] + 1;
                    histogramaPosicao[index] = pixel;
                    index++;
                }

                float aux = alfa * histograma[0];
                histograma_acumulado[0] = (int)aux;

                for (int pos = 1; pos < histograma.Length; pos++)               //calcula histograma acumulado
                {
                    aux = histograma_acumulado[pos - 1] + alfa * histograma[pos];
                    histograma_acumulado[pos] = (int)aux;
                }

                index = 0;
                for (int pos = 0; pos < imgArrayFinal.Length; pos += 4)
                {
                    imgArrayFinal[pos] = imgArrayFinal[pos + 1] = imgArrayFinal[pos + 2] = (byte)histograma_acumulado[histogramaPosicao[index]];
                    index++;
                }
            }

            Marshal.Copy(imgArrayFinal, 0, ptrImage, bytes);
            tempImage.UnlockBits(TempImageData);


            ImagemOriginal imagemExtra = new ImagemOriginal();

            imagemExtra.Show();
            posHistogramaEqual = (Image)tempImage.Clone();
            imagemExtra.updateImage(posHistogramaEqual);
            imagemExtra.updateImage(posHistogramaEqual);
            imagemExtra.updateImage(posHistogramaEqual);
        }