Bitmap/Histogram: Difference between revisions

(Updated D entry)
Line 1,168:
}
Return</lang>
 
=={{header|zkl}}==
{{trans|C}}
Uses the PPM class from http://rosettacode.org/wiki/Bitmap/Bresenham%27s_line_algorithm#zkl
<lang zkl>fcn histogram(image){
hist:=(256).pump(List(),0);
image.data.pump(0,Void,'wrap(c){ hist[c]+=1 });
hist;
}
fcn histogramMedian(hist){
from,to:=0,(2).pow(8) - 1; // 16 bits of luminance
left,right:=hist[from],hist[to];
while(from!=to){
if(left<right){ from+=1; left +=hist[from]; }
else { to -=1; right+=hist[to]; }
}
from
}</lang>
<lang zkl>fcn readPPMFile(fileName){
image:=File(f:=fileName,"rb").read(); f.close();
image.readln(2);
w,h:=image.readln().split().apply("toInt");
 
image.del(0,image.find("\n255\n") + 5);// del PPM header
ppm:=PPM(w,h);
ppm.data.clear(); // gonna write file image data
// image is stored upside down
[h-1..0, -1].pump(ppm.data,'wrap(h){ image.seek(3*h*w); image.read(3*w) });
ppm
}
 
img:=readPPMFile("lenaGrey.ppm"); // a grey scale image
median:=histogramMedian(histogram(img));
median.println();
 
bw:=PPM(img.w,img.h);
// stream bytes from orginal, convert to black/white, write to new image
// each pixel is 24 bit RGB
img.data.pump(0,bw.data.clear(),'wrap(c){ if(c>median) 0xff else 0 });
 
bw.write(File("foo.ppm","wb"));</lang>lenaBW.jpg
{{out}}<pre>101</pre>
http://home.comcast.net/~zenkinetic/Images/lenaBW.jpg
 
 
{{omit from|PARI/GP}}
Anonymous user