public void SetImageHistogram(ImageHistogram imageHistogram)
 {
     if (imageHistogram == null)
     {
         return;
     }
     this.imageHistogram = imageHistogram;
     xMin = 0;
     xMax = 256;
     yMin = 0;
     yMax = this.imageHistogram.PixelNumberList.Max();
     SetScales();
     Invalidate();
 }
Exemplo n.º 2
0
        private void ApplyHistButton_Click(object sender, EventArgs e)
        {
            if (HistMatchCheck.Checked)
            {
                Bitmap Img1   = new Bitmap(SourceBox.Text);
                Bitmap Img2   = new Bitmap(TargetBox.Text);
                Bitmap newImg = ImageHistogram.histMatching(Img1, Img2);
                AfterBox.Image = newImg;
                refreshHistograms();
                return;
            }
            Bitmap B;

            if (sourceBitmap == null)
            {
                return;
            }
            B = new Bitmap(sourceBitmap);
            ImageHistogram imageHist = new ImageHistogram(B);

            if (GrayCheck.Checked)
            {
                imageHist.grayScale();
            }
            if (BrightCheck.Checked)
            {
                imageHist.changeBrightness(int.Parse(BrightBox.Text));
            }
            if (ContrastCheck.Checked)
            {
                imageHist.changeContrast(int.Parse(ContrastMinBox.Text), (int.Parse(ContrastMaxBox.Text)));
            }
            if (GammaCheck.Checked)
            {
                imageHist.changeGamma(double.Parse(GammaBox.Text));
            }
            if (HistEqCheck.Checked)
            {
                imageHist.histEqualization();
            }
            AfterBox.Image = imageHist.getImage();
            refreshHistograms();
        }
Exemplo n.º 3
0
        private void refreshHistograms()
        {
            RedHistogramChart.Series.Clear();
            RedHistogramChart.Series.Add("Pixel Values");
            GreenHistogramChart.Series.Clear();
            GreenHistogramChart.Series.Add("Pixel Values");
            BlueHistogramChart.Series.Clear();
            BlueHistogramChart.Series.Add("Pixel Values");
            GrayHistogramChart.Series.Clear();
            GrayHistogramChart.Series.Add("Pixel Values");


            ImageHistogram imageHist = new ImageHistogram(new Bitmap(AfterBox.Image));

            imageHist.calcHist();
            Random r       = new Random();
            int    maxR    = 0;
            int    maxG    = 0;
            int    maxB    = 0;
            int    maxGray = 0;

            for (int i = 0; i < 255; i++)
            {
                maxR    = Math.Max(imageHist.redHist[i], maxR);
                maxG    = Math.Max(imageHist.greenHist[i], maxG);
                maxB    = Math.Max(imageHist.blueHist[i], maxB);
                maxGray = Math.Max(imageHist.grayHist[i], maxGray);
            }

            for (int i = 0; i < 255; i++)
            {
                GrayHistogramChart.Series[0].Points.Add(imageHist.grayHist[i] / (double)maxGray);
                RedHistogramChart.Series[0].Points.Add(imageHist.redHist[i] / (double)maxR);
                GreenHistogramChart.Series[0].Points.Add(imageHist.greenHist[i] / (double)maxG);
                BlueHistogramChart.Series[0].Points.Add(imageHist.blueHist[i] / (double)maxB);
            }
        }
Exemplo n.º 4
0
        public static void EqualizeHistogram(FastBitmap bmp, EqualizationMethod method)
        {
            ImageHistogram hist = new ImageHistogram(bmp);
            int R = 0;
            double hInt = 0.0;
            double[] left = new double[256];
            double[] right = new double[256];
            int[] newValue = new int[256];

            for (int i = 0; i < 256; ++i)
            {
                left[i] = R;
                hInt += hist.table[i];
                while (hInt > hist.average)
                {
                    hInt -= hist.average;
                    if (R < 255)
                        R++;
                }

                right[i] = R;
                switch (method)
                {
                    case EqualizationMethod.Averages:
                        newValue[i] = (int)((left[i] + right[i]) / 2.0);
                        break;
                    case EqualizationMethod.Random:
                        newValue[i] = (int)(right[i] - left[i]);
                        break;
                    case EqualizationMethod.Own:
                        newValue[i] = (int)((left[i] + right[i]) / 2.0);
                        break;
                }
            }

            for (int i = 0; i < bmp.Size.Width; ++i)
            {
                for (int j = 0; j < bmp.Size.Height; ++j)
                {
                    Color color = bmp[i, j];
                    if (left[color.R] == right[color.R])
                        bmp[i, j] = Color.FromArgb(color.A, (int)left[color.R], (int)left[color.R], (int)left[color.R]);
                    else
                    {
                        switch (method)
                        {
                            case EqualizationMethod.Averages:
                                bmp[i, j] = Color.FromArgb(color.A, (int)newValue[color.R], (int)newValue[color.R], (int)newValue[color.R]);
                                break;
                            case EqualizationMethod.Random:
                                Random rnd = new Random();
                                int value = (int)left[color.R] + rnd.Next(newValue[color.R] + 1);
                                bmp[i, j] = Color.FromArgb(color.A, value, value, value);
                                break;
                            case EqualizationMethod.Neighborhood8:
                                double average = 0;
                                int count = 0;
                                foreach (Point offset in new Point[] { new Point(1, 0), new Point(-1, 0), new Point(0, 1), new Point(0, -1), new Point(1, 1), new Point(-1, -1), new Point(-1, 1), new Point(1, -1) })
                                {
                                    if (i + offset.X >= 0 && i + offset.X < bmp.Width && j + offset.Y >= 0 && j + offset.Y < bmp.Height)
                                    {
                                        average += bmp[i + offset.X, j + offset.Y].R;
                                        ++count;
                                    }
                                }
                                average /= count;
                                if (average > right[color.R])
                                    bmp[i, j] = Color.FromArgb(color.A, (int)right[color.R], (int)right[color.R], (int)right[color.R]);
                                else if (average < left[color.R])
                                    bmp[i, j] = Color.FromArgb(color.A, (int)left[color.R], (int)left[color.R], (int)left[color.R]);
                                else
                                    bmp[i, j] = Color.FromArgb(color.A, (int)average, (int)average, (int)average);
                                break;
                            case EqualizationMethod.Own:
                                bmp[i, j] = Color.FromArgb(color.A, (int)newValue[color.R], (int)newValue[color.R], (int)newValue[color.R]);
                                break;
                        }
                    }
                }
            }
        }
Exemplo n.º 5
0
 private void histogramToolStripMenuItem_Click(object sender, EventArgs e)
 {
     ImagePreview imageForm = (ImagePreview)this.ActiveMdiChild;
     ImageHistogram imageHistogram = new ImageHistogram(imageForm.Image);
     imageHistogram.MdiParent = this;
     imageHistogram.Show();
     /*HistogramWindow imageHistogram = new HistogramWindow();
     imageHistogram.GatherStatistics(bitmap);
     imageHistogram.Show();
     imageHistogram.MdiParent = this;*/
 }
Exemplo n.º 6
0
        /// <summary>
        /// Calculate imilarity stats when images are changed
        /// </summary>
        private void ImageSimilarityStats()
        {
            // update image similarity stats
            if (image1 != null && image2 != null)
            {
                if (image_changed)
                {
                    UpdateImages();
                    image_changed = false;

                    // reduce image size for calculation
                    var smaller_image1 = CommonUtils.ImageUtils.Resize(image1, smaller_img_size.Width, smaller_img_size.Height, false);
                    var smaller_image2 = CommonUtils.ImageUtils.Resize(image2, smaller_img_size.Width, smaller_img_size.Height, false);

                    // compare dominant colors
                    var top_color1     = Images.ColorExtract.TopColors(image1);
                    var top_color1_img = (Image)Images.ColorExtract.Draw(top_color1, Images.ColorExtract.top_colors * 2, 4);

                    var top_color2     = Images.ColorExtract.TopColors(image2);
                    var top_color2_img = (Image)Images.ColorExtract.Draw(top_color2, Images.ColorExtract.top_colors * 2, 4);

                    var main_color1_img = Images.ColorExtract.Draw(top_color1, 1, 2);
                    var main_color2_img = Images.ColorExtract.Draw(top_color2, 1, 2);

                    double dcolor_similarity = Images.ImageSimilarity.CompareImages(top_color1_img, top_color2_img, method: ComparisonMethod.PixelsDifferenceSorted);

                    pictureBox_DominantColor1.Image = top_color1_img;
                    pictureBox_DominantColor1.Refresh();
                    pictureBox_Color1.Image = main_color1_img;
                    pictureBox_Color1.Refresh();

                    pictureBox_DominantColor2.Image = top_color2_img;
                    pictureBox_DominantColor2.Refresh();
                    pictureBox_Color2.Image = main_color2_img;
                    pictureBox_Color2.Refresh();

                    UpdateSimilarityLabel(labelDominantColors_similarity, dcolor_similarity);

                    // compare average hash
                    double avghash_similarity = Images.ImageHash.Compare(smaller_image1, smaller_image2, Images.ImageHashAlgorithm.Average);
                    UpdateSimilarityLabel(label_AvgHash_similarity, avghash_similarity);

                    // compare block hash
                    double blockhash_similarity = Images.ImageHash.Compare(image1, image2, Images.ImageHashAlgorithm.Block);
                    UpdateSimilarityLabel(label_BlockHash_similarity, blockhash_similarity);

                    // compare difference hash
                    double diffhash_similarity = Images.ImageHash.Compare(smaller_image1, smaller_image2, Images.ImageHashAlgorithm.Difference);
                    UpdateSimilarityLabel(label_DiffHash_similarity, diffhash_similarity);

                    // compare perceptual hash
                    double phash_similarity = Images.ImageHash.Compare(smaller_image1, smaller_image2, Images.ImageHashAlgorithm.Perceptive);
                    UpdateSimilarityLabel(label_PHash_similarity, phash_similarity);

                    // compare MD5 hash
                    double md5hash_similarity = Images.ImageHash.Compare(smaller_image1, smaller_image2, Images.ImageHashAlgorithm.MD5);
                    UpdateSimilarityLabel(label_MD5Hash_similarity, md5hash_similarity);

                    // RGB histograms

                    var rgb1_bmp = ImageHistogram.DrawRgbHistogramChart(smaller_image1);

                    pictureBox_RGB1.Image = CommonUtils.ImageUtils.Resize(rgb1_bmp, rgb_img_size);
                    pictureBox_RGB1.Refresh();

                    var rgb2_bmp = ImageHistogram.DrawRgbHistogramChart(smaller_image2);

                    pictureBox_RGB2.Image = CommonUtils.ImageUtils.Resize(rgb2_bmp, rgb_img_size);
                    pictureBox_RGB2.Refresh();

                    rgb1_bmp.Dispose();
                    rgb2_bmp.Dispose();

                    // RGB avg histogram
                    double rgb_avg_similarity = ImageHistogram.CompareAvgRgbHistogram(smaller_image1, smaller_image2);

                    UpdateSimilarityLabel(label_RGBHistogramAverage_similarity, rgb_avg_similarity);

                    // RGB histogram
                    double rgb_similarity = ImageHistogram.CompareRgbHistogram(smaller_image1, smaller_image2);
                    UpdateSimilarityLabel(label_RGBHistogram_similarity, rgb_similarity);

                    // RGB hash
                    double rgb_hash_similarity = Images.ImageHash.Compare(smaller_image1, smaller_image2, Images.ImageHashAlgorithm.Histogram);;
                    UpdateSimilarityLabel(label_HistogramHash_similarity, rgb_hash_similarity);

                    // RGB pixels similarity
                    double rgb_pixels_similarity = ImageSimilarity.CompareImages(smaller_image1, smaller_image2, ComparisonMethod.PixelsDifference);
                    UpdateSimilarityLabel(label_DiffPixelsRgb_similarity, rgb_pixels_similarity);

                    double rgb_pixels_similarity_sorted = ImageSimilarity.CompareImages(smaller_image1, smaller_image2, ComparisonMethod.PixelsDifferenceSorted);
                    UpdateSimilarityLabel(label_DiffPixelsRgb_sorted_similarity, rgb_pixels_similarity_sorted);

                    double dist_rgb_pixels_similarity = ImageSimilarity.CompareImages(smaller_image1, smaller_image2, ComparisonMethod.PixelsDistance);
                    UpdateSimilarityLabel(label_DistPixelsRgb_similarity, dist_rgb_pixels_similarity);

                    double dist_rgb_pixels_similarity_sorted = ImageSimilarity.CompareImages(smaller_image1, smaller_image2, ComparisonMethod.PixelsDistanceSorted);
                    UpdateSimilarityLabel(label_DistPixelsRgb_sorted_similarity, dist_rgb_pixels_similarity_sorted);

                    // feature detection
                    double nfeature = 0;
                    double nmatch   = 0;
                    Bitmap view;

                    double feature_similarity = ImageSimilarity.CompareFeatures(image1, image2, out nfeature, out nmatch, out view);
                    //pictureBox_Feature.Image = CommonUtils.ImageUtils.Resize(view, feature_img_size,true);
                    pictureBox_Feature.Image = CommonUtils.ImageUtils.Resize(view, feature_img_size.Width, feature_img_size.Height);
                    pictureBox_Feature.Refresh();
                    label_FeatureStats.Text = String.Format("{0} match", ((int)nmatch));
                    //label_FeatureStats.Text = ((int)nmatch).ToString();
                    label_FeatureStats.Refresh();
                    UpdateSimilarityLabel(this.label_Feature_similarity, feature_similarity);

                    // GC.Collect(); // force GC to free memory
                    // GC.WaitForPendingFinalizers();
                }
            } // have 0 or 1 images
            else
            {
                //update images
                UpdateImages();
            }
        }