1.直接上代码:
/// <summary> /// 增强图像因子改变(imageArray) /// </summary> /// <param name="rawDataArray">摄像头得到的二维short矩阵</param> /// <param name="iImageHeight">rawDataArray高</param> /// <param name="iImageWidth">rawDataArray宽</param> /// <param name="rawImageArray">表示要显示图像的byte矩阵</param> public void enhancePar(short[,] rawDataArray, int iImageHeight, int iImageWidth, ref byte[,] rawImageArray) { int gamma = int.Parse(inifile.ReadString("Config", "gamma", "255")); //int gamma = vScrollBarHeight.Value * 255 / vScrollBarHeight.Maximum; if (rawDataArray == null) return; short[] HistoryData = new short[5000]; byte[] LUT = new byte[5000]; int i, j; //int shangX=vScrollBarHeight.Maximum - vScrollBarHeight.Value; //int xiaX=vScrollBarHeight.Maximum - vScrollBarHeight.Value - (int)(double.Parse(TextWindowWidth.Text) * 100); //Console.WriteLine(shangX+" "+xiaX); for (j = 0; j < iImageHeight; j++) for (i = 0; i < iImageWidth; i++) { if (rawDataArray[i, j] <= 0) { continue; } if (rawDataArray[i, j] >= (vScrollBarHeight.Maximum - vScrollBarHeight.Value))//如果大于赋色彩窗体最高值 { rawDataArray[i, j] = 0; } if (rawDataArray[i, j] <= (vScrollBarHeight.Maximum - vScrollBarHeight.Value - double.Parse(TextWindowWidth.Text) * 100))//如果小于赋色彩窗体最低值 { rawDataArray[i, j] = 0; } HistoryData[rawDataArray[i, j]]++; } int sum = 0, HistorySum = 0; for (i = 0; i < 5000; i++)//对255灰阶进行着重处理 { if (HistoryData[i] > 10) { HistoryData[i] = 10; } if (HistoryData[i] < 3) { HistoryData[i] = 0; } HistorySum += HistoryData[i]; } sum = 0; for (i = 0; i < 5000; i++) { //if (HistoryData[i] == 0) //{ // LUT[i] = (byte)(1); // continue; //} sum += HistoryData[i]; if (HistorySum != 0) { LUT[i] = (byte)((sum * gamma / HistorySum + 1) >= 254 ? 254 : (sum * gamma / HistorySum + 1));//得到图像矩阵 } else { LUT[i] = (byte)(1); } } for (j = 0; j < iImageHeight; j++) for (i = 0; i < iImageWidth; i++) { if (rawDataArray[i, j] < 0) { continue; } else { rawImageArray[i, j] = LUT[rawDataArray[i, j]];//赋值给界面显示的图像矩阵 } } }
注:此代码有点简单,可深究图像增强算法。