[函數名稱]html
彩色圖像密度分割函數 DensitySegmentProcess(WriteableBitmap src)算法
[算法說明]函數
圖像密度分割又叫作彩色等密度分割處理,通常圖像(或影像)上色調的明暗是以附着在片基上的銀粒子密度來計量的。所以,爲了突出某一密度等級的色調(或相應地物),即將圖像(或影像)的色調密度分劃成若干個等級,並用不一樣的顏色分別表示這不一樣的密度等級,獲得一幅彩色的等密度分割圖像。這一技術過程就叫做密度分割處理,或簡稱密度分割。密度分割可以使影像輪廓更清晰,突出某些具備必定色調特徵的地物及分佈狀態,在顯示環境污染範圍,隱伏構造,以及尋找地下水等方面有普遍的應用,並取得較好的效果。密度分割後獲得的彩色圖像的色彩是人爲加於的,通常並不表明地物的實際顏色,因此通常也稱密度分割爲假彩色密度分割。spa
這裏咱們列舉的是基於顏色灰度的密度分割。.net
[函數代碼]code
/// <summary> /// Density segmentation. /// </summary> /// <param name="src">The source image.</param> /// <returns></returns> public static WriteableBitmap DensitySegmentProcess(WriteableBitmap src)////彩色圖像密度分割 { if (src != null) { int w = src.PixelWidth; int h = src.PixelHeight; WriteableBitmap srcImage = new WriteableBitmap(w, h); byte[] temp = src.PixelBuffer.ToArray(); int color = 0; for (int i = 0; i < temp.Length; i += 4) { byte tempByte = (byte)((int)(temp[i] * 0.114 + temp[i + 1] * 0.587 + temp[i + 2] * 0.299)); color = GetColor(tempByte); switch (color) { case 1: temp[i] = (byte)255; temp[i + 1] = (byte)255; temp[i + 2] = (byte)0; break; case 2: temp[i] = (byte)255; temp[i + 1] = (byte)0; temp[i + 2] = (byte)255; break; case 3: temp[i] = (byte)0; temp[i + 1] = (byte)255; temp[i + 2] = (byte)255; break; case 4: temp[i] = (byte)255; temp[i + 1] = (byte)0; temp[i + 2] = (byte)0; break; case 5: temp[i] = (byte)0; temp[i + 1] = (byte)0; temp[i + 2] = (byte)255; break; case 0: temp[i] = (byte)0; temp[i + 1] = (byte)0; temp[i + 2] = (byte)0; break; default: break; } } Stream sTemp = srcImage.PixelBuffer.AsStream(); sTemp.Seek(0, SeekOrigin.Begin); sTemp.Write(temp, 0, w * 4 * h); return srcImage; } else { return null; } } //定義密度等級得到函數 private static int GetColor(int v) { int t = 0; if (v == 0) { t = 0; } else if (v > 0 && v < 50) { t = 1; } else if (v >= 50 && v < 100) { t = 2; } else if (v >= 100 && v < 150) { t = 3; } else if (v >= 150 && v < 200) { t = 4; } else { t = 5; } return t; }