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);
}
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