2009-08-18 7 views
5

Tôi có một mảng các BitmapFrames và cần thực hiện một dải biểu đồ. Tôi biết điều này khác với sự cân bằng biểu đồ, và kết quả cuối cùng là gì ... sorta. vấn đề là tôi hoàn toàn không biết phải làm gì sau khi tôi nhận được biểu đồ.Tôi cần làm một dải biểu đồ

Cho đến nay mã của tôi tạo một mảng cho biểu đồ nên tôi biết số lượng pixel của mỗi giá trị tôi có. Nhưng sau đó tôi không biết phải làm gì.

đây là đoạn code tôi đã cho đến nay ... ngay bây giờ nó làm cho các biểu đồ và sau đó histogram equalizes ... đó là KHÔNG những gì tôi muốn ... Tôi chỉ cố gắng để tìm hiểu thêm về biểu đồ

[Cmdlet(VerbsData.ConvertTo, "HistoStretch")] 
public class HistoStretchCmdlet : PSCmdlet 
{ 
    private BitmapFrame[] bFrame, outFrame; 
    private BitmapSource src; 
    private double pixelsize; 
    private byte[] pixels, outPixels; 
    private byte MAX_VAL; 
    private int[] histogram; 
    private int cf, start; 

    [Parameter(ValueFromPipeline = true, 
     ValueFromPipelineByPropertyName = true), ValidateNotNullOrEmpty] 
    public BitmapFrame[] Bitmap 
    { 
     get 
     { 
      return bFrame; 
     } 
     set 
     { 
      bFrame = value; 
     } 
    } 

    protected override void ProcessRecord() 
    { 
     base.ProcessRecord(); 
     Console.Write("Applying a histogram stretch to the image...\n\n"); 
     outFrame = new BitmapFrame[bFrame.Length]; 
     for (int c = 0; c < bFrame.Length; c++) 
     { 
      MAX_VAL = (byte)((1 << bFrame[c].Format.BitsPerPixel) - 1); 
      histogram = new int[MAX_VAL + 1]; 
      for (int i = 0; i <= MAX_VAL; i++) 
      { 
       histogram[i] = 0; 
      } 

      pixelsize = bFrame[c].PixelWidth * bFrame[c].PixelHeight; 
      pixels = new byte[(int)pixelsize]; 
      outPixels = new byte[(int)pixelsize]; 
      bFrame[c].CopyPixels(pixels,(int)bFrame[c].Width * (bFrame[c].Format.BitsPerPixel/8),0); 

      for (int i = 0; i < pixelsize; i++) 
      { 
       histogram[(int)pixels[i]] = histogram[(int)pixels[i]] + 1; 
      } 
      for (int i = 0; i <= MAX_VAL; i++) 
      { 
       Console.Write("{0}: {1}\n", i, histogram[i]); 
      } 
      for (int i = 0; i <= MAX_VAL; i++) 
      { 
       if (histogram[i] >= 1) 
       { 
        start = i; 
        break; 
       } 
      } 

      for (int i = 0; i < pixelsize; i++) 
      { 
       cf = 0; 
       for (int g = 0; g <= MAX_VAL; g++) 
       { 
        cf += histogram[g]; 
        if (g == pixels[i]) 
        { 
         break; 
        } 
       } 
       outPixels[i] = (byte)(cf * (MAX_VAL/pixelsize)); 
      } 

      src = BitmapSource.Create(bFrame[c].PixelWidth, bFrame[c].PixelHeight, bFrame[c].DpiX, bFrame[c].DpiY, 
       bFrame[c].Format, bFrame[c].Palette, outPixels, (int)(bFrame[c].Width * (bFrame[c].Format.BitsPerPixel/8))); 
      outFrame[c] = BitmapFrame.Create(src); 
     } 
     WriteObject(outFrame); 
    } 
} 

đây là những gì biểu đồ sẽ giống như theo giáo viên của tôi:

http://www.fileden.com/files/2009/8/18/2547657/histostretch.PNG

tôi chạy đoạn mã trên ... và có một thẳng đen ima ge. đây là mã của tôi:

outFrame = new BitmapFrame[bFrame.Length]; 
     for (int c = 0; c < bFrame.Length; c++) 
     { 
      MAX_VAL = (byte)((1 << bFrame[c].Format.BitsPerPixel) - 1); 
      histogram = new int[MAX_VAL + 1]; 
      for (int i = 0; i <= MAX_VAL; i++) 
      { 
       histogram[i] = 0; 
      } 

      pixelsize = bFrame[c].PixelWidth * bFrame[c].PixelHeight; 
      pixels = new byte[(int)pixelsize]; 
      outPixels = new byte[(int)pixelsize]; 
      bFrame[c].CopyPixels(pixels,(int)bFrame[c].Width * (bFrame[c].Format.BitsPerPixel/8),0); 
      max = pixels[0]; 
      min = pixels[0]; 

      for (int i = 0; i < pixelsize; i++) 
      { 
       histogram[(int)pixels[i]] = histogram[(int)pixels[i]] + 1; 
       if((int)pixels[i] > max) 
        max = pixels[i]; 
       if((int)pixels[i] < min) 
        min = pixels[i]; 
      } 

      dynamic = max - min; 

      for (int i = 0; i < pixelsize; i++) 
      { 
       outPixels[i] = (byte)(((pixels[i] - min)/dynamic) * MAX_VAL); 
      } 

Trả lời

9

Histogram duỗimapping các giá trị điểm ảnh như vậy:

  • giá trị thấp nhất (ví dụ 84 trong hình minh họa) trở thành 0
  • cao nhất giá trị (ví dụ: 153 trong hình minh họa) trở thành 255 (trong hình ảnh 8bit)
  • và tất cả các giá trị trung gian được nội suy giữa phạm vi đó (xem tôi llustration).

Nói cách khác, kéo dài biểu đồ có nghĩa là kéo dài năng động của dữ liệu hình ảnh (84: 153) thành động lớn nhất có thể (0: 255).

Điều này không ảnh hưởng đến độ cao của các đỉnh biểu đồ, mà chỉ ảnh hưởng đến độ cao của chúng (hình minh họa có chút sai lệch về điểm này).

histogram stretch http://cct.rncan.gc.ca/resource/tutor/fundam/images/linstre.gif

Image source

Trong thực tế đây là bản đồ bạn sẽ áp dụng cho các điểm ảnh của hình ảnh (giả):

maxVal = image.maximumValue() # 153 
minVal = image.minumumValue() # 84 
dynamic = maxVal-minVal 
for pixel in image.Pixels(): 
    newPixel = ((pixel-minVal)/dynamic)*255 
+0

tôi cố gắng thực hiện điều đó ... xem "câu trả lời" của tôi dưới đây ... đó là mã mới tôi có cho nó nhưng nó không hoạt động – dabonz413

0

Nếu bạn có kiểm soát ánh sáng và hoặc đạt được/bù đắp của máy ảnh, bạn có thể tối ưu hóa và kéo dài biểu đồ như bạn mong muốn.

+0

Tôi không có kiểm soát của máy ảnh nào. đây là tất cả đối phó với bất kỳ hình ảnh tôi ngẫu nhiên đưa ra – dabonz413

0

Đừng quên xem xét nổi. Vì vậy, một sửa đổi nhỏ để trả lời dabonz413 của:

maxVal = image.maximumValue() # 153 
minVal = image.minumumValue() # 84 
dynamic = maxVal-minVal 
for pixel in image.Pixels(): 
    newPixel = ((float) (pixel-minVal)/dynamic)*255