Win8 Metro(C#)數字圖像處理--2.41彩色圖像密度分割算法

原文: Win8 Metro(C#)數字圖像處理--2.41彩色圖像密度分割算法



[函數名稱]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;
        }
相關文章
相關標籤/搜索