影象的熵、灰度平均值、灰度中值、方差
阿新 • • 發佈:2019-01-05
//影象的熵========================================================================================= private void Menu_Entropy_Click(object sender, EventArgs e) { if (curBitmap != null) { //計算熵 double entropy = GetEntropy(curBitmap, curBitmap.Width, curBitmap.Height); MessageBox.Show("影象:"+curFileName +"nn"+"影象熵為 H = " + entropy); } } //計算熵的函式----------------------------------------------- public double GetEntropy(Bitmap bmp, int w, int h) { int g; double H = 0.0; int[] pix = new int[256]; Array.Clear(pix, 0, 256); //獲取各灰度值的畫素個數 for (int i = 0; i < h; i++) { for (int j = 0; j < w; j++) { Color c = bmp.GetPixel(j, i); g = (int)(0.299*c.R + 0.587*c.B + 0.114*c.G); pix[g]++; } } //計算熵 for (int i = 0; i < 256; i++) if (pix[i] > 0) H = H + pix[i] * Math.Log10(pix[i]); H = Math.Log10(w * h) / Math.Log10(2) - H / (w * h * Math.Log10(2)); return H; } //灰度平均值======================================================================================= private void Menu_GrayAverage_Click(object sender, EventArgs e) { if (curBitmap != null) { double aver = GetGrayAverage(curBitmap, curBitmap.Width, curBitmap.Height); MessageBox.Show("影象:" + curFileName +"nn"+ "灰度平均值為 A = " + aver); } } //計算灰度平均值的函式--------------------------------------- public double GetGrayAverage(Bitmap bmp, int w, int h) { double sum = 0; //計算平均值 for (int i = 0; i < w; i++) for (int j = 0; j < h; j++) { Color c = bmp.GetPixel(i, j); sum = sum + (int)(0.299 * c.R + 0.587 * c.B + 0.114 * c.G); } double aver = sum / (w * h); return aver; } //灰度中值========================================================================================= private void Menu_GrayMid_Click(object sender, EventArgs e) { if (curBitmap != null) { Bitmap bmp = curBitmap; //由5 X 5的矩形獲取值 int[] pix = new int[25]; for (int j = 0; j < 5; j++) { for (int i = 0; i < 5; i++) { pix[i + j * 5] = bmp.GetPixel(100 + i, 100 + j).B; } } pix = MedianSorter(pix,25); MessageBox.Show("影象:" + curFileName + "n" + "左上角座標為(100,100)的5X5矩形塊n灰度中值為" + " M = " + pix[12]); } } //排序------------------------------------------------------- public int[] MedianSorter(int[] data, int m) { int tem; for (int i = m - 1; i >= 1; i--) for (int j = 1; j <= i; j++) if (data[j - 1] > data[j]) { tem = data[j]; data[j] = data[j - 1]; data[j - 1] = tem; } return data; } //方差============================================================================================= private void Menu_Variance_Click(object sender, EventArgs e) { if (curBitmap != null) { double vari = GetVariance(curBitmap, curBitmap.Width, curBitmap.Height); MessageBox.Show("影象:" + curFileName + "nn" + "方差值 S = " + vari); } } //計算方差值的函式------------------------------------------- public double GetVariance(Bitmap bmp, int w, int h) { double aver, vari =0; int data; //求平均值 aver = GetGrayAverage(bmp ,w , h); //求方差 for (int i = 0; i < w; i++) { for (int j = 0; j < h; j++) { Color c = bmp.GetPixel(i, j); data = (int)(0.299 * c.R + 0.587 * c.B + 0.114 * c.G); vari = vari + (data - aver) * (data - aver); } } vari = vari / (w * h); return vari; }