2016年6月2日 星期四

C#-examination-4

題目要求:

  • button1: 讀圖 lena 與 lena_2
  • button2: 求 lena 與 lena_2之差異 difference
  • button3: 將差異轉成灰階圖
  • button4: 利用影像增強手法將 button3 之差異強化
##ReadMore##

比較圖一:lena



比較圖二:lena_2


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using AForge.Imaging;
using AForge.Imaging.Formats;
using AForge.Imaging.Filters;
using AForge.Video;
using System.Diagnostics;
using System.Drawing.Imaging;
using AForge.Math;

namespace examination_4
{
    public partial class exam4 : Form
    {
        Bitmap img1, img2, catchImg, grayImg;
        

        public exam4()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            openFileDialog1.Filter = "所有檔案(*.*)|*.*";
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                img1 = ImageDecoder.DecodeFromFile(openFileDialog1.FileName);
                pictureBox1.Image = img1;
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            openFileDialog2.Filter = "所有檔案(*.*)|*.*";
            if (openFileDialog2.ShowDialog() == DialogResult.OK)
            {
                img2 = ImageDecoder.DecodeFromFile(openFileDialog2.FileName);
                pictureBox2.Image = img2;
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            img1 = (Bitmap)pictureBox1.Image;
            img2 = (Bitmap)pictureBox2.Image;
        }

        private void button3_Click(object sender, EventArgs e)
        {
            // 取兩圖長、寬最小值
            int imgWidth = Math.Min(img1.Width, img2.Width);
            int imgHeight = Math.Min(img1.Height, img2.Height);
            int minX = imgWidth;
            int minY = imgHeight;
            int maxX = 0;
            int maxY = 0;

            // 比較的 Pixel 範圍
            for (int x = 0; x < imgWidth; x++)
            {
                for (int y = 0; y < imgHeight; y++)
                {
                    // 比較兩圖 Pixel
                    if(img1.GetPixel(x,y).Equals(img2.GetPixel(x,y)))
                    {
                        // 相同 Pixel ,維持原圖                        
                    }
                    else
                    {
                        // 不相同

                        // 取差異圖最左上點
                        if (minX > x)
                            minX = x;
                        if (minY > y)
                            minY = y;

                        // 取差異圖最右下點
                        if (maxX < x)
                            maxX = x;
                        if (maxY < y)
                            maxY = y;
                    }
                }
            }
            
            catchDiff(minX, minY, maxX, maxY);
            drawDiffFrame(minX, minY, maxX, maxY);

            pictureBox1.Image = img1;
            pictureBox2.Image = img2;
        }

        // 補捉兩圖不同點於 pictureBox3
        private void catchDiff(int topLeft_X, int topLeft_Y, int bottomRight_X, int bottomRight_Y)
        {
            Crop cropFilter = new Crop(new Rectangle(topLeft_X - 5, topLeft_Y - 5, bottomRight_X - topLeft_X + 10, bottomRight_Y - topLeft_Y + 10));
            catchImg = cropFilter.Apply(img2);
            pictureBox3.Image = catchImg;
        }

        // 於原圖及比對圖畫出框,框出差異
        private void drawDiffFrame(int topLeft_X, int topLeft_Y, int bottomRight_X, int bottomRight_Y)
        {
            using (Graphics g = Graphics.FromImage(img1))
            {
                g.DrawRectangle(new Pen(Color.Red), topLeft_X - 6, topLeft_Y - 6, bottomRight_X - topLeft_X + 12, bottomRight_Y - topLeft_Y + 12);
            }
            using (Graphics g = Graphics.FromImage(img2))
            {
                g.DrawRectangle(new Pen(Color.Red), topLeft_X - 6, topLeft_Y - 6, bottomRight_X - topLeft_X + 12, bottomRight_Y - topLeft_Y + 12);
            }
        }

        // 影像灰階
        private void button4_Click(object sender, EventArgs e)
        {
            Grayscale grayFilter = new Grayscale(0.2125, 0.7154, 0.0721);
            grayImg = grayFilter.Apply(catchImg);
            pictureBox3.Image = grayImg;
        }

        // 續影像灰階,再影像強化處理
        private void button5_Click(object sender, EventArgs e)
        {
            Bitmap thsImg;
            Threshold thFilter = new Threshold(23);
            thsImg = thFilter.Apply(grayImg);
            pictureBox3.Image = thsImg;
        }

    }
}

沒有留言:

張貼留言