September 2017 Update
This commit is contained in:
parent
bba7bfd280
commit
ba8067c3b7
14570 changed files with 153136 additions and 63871 deletions
46
Task/Bitmap-Histogram/Common-Lisp/bitmap-histogram.lisp
Normal file
46
Task/Bitmap-Histogram/Common-Lisp/bitmap-histogram.lisp
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
(defpackage #:histogram
|
||||
(:use #:cl
|
||||
#:opticl))
|
||||
|
||||
(in-package #:histogram)
|
||||
|
||||
(defun color->gray-image (image)
|
||||
(check-type image 8-bit-rgb-image)
|
||||
(let ((gray-image (with-image-bounds (height width) image
|
||||
(make-8-bit-gray-image height width :initial-element 0))))
|
||||
(do-pixels (i j) image
|
||||
(multiple-value-bind (r g b) (pixel image i j)
|
||||
(let ((gray (+ (* 0.2126 r) (* 0.7152 g) (* 0.0722 b))))
|
||||
(setf (pixel gray-image i j) (round gray)))))
|
||||
gray-image))
|
||||
|
||||
(defun make-histogram (image)
|
||||
(check-type image 8-bit-gray-image)
|
||||
(let ((histogram (make-array 256 :element-type 'fixnum :initial-element 0)))
|
||||
(do-pixels (i j) image
|
||||
(incf (aref histogram (pixel image i j))))
|
||||
histogram))
|
||||
|
||||
(defun find-median (histogram)
|
||||
(loop with num-pixels = (loop for count across histogram sum count)
|
||||
with half = (/ num-pixels 2)
|
||||
for count across histogram
|
||||
for i from 0
|
||||
sum count into acc
|
||||
when (>= acc half)
|
||||
return i))
|
||||
|
||||
(defun gray->black&white-image (image)
|
||||
(check-type image 8-bit-gray-image)
|
||||
(let* ((histogram (make-histogram image))
|
||||
(median (find-median histogram))
|
||||
(bw-image (with-image-bounds (height width) image
|
||||
(make-1-bit-gray-image height width :initial-element 0))))
|
||||
(do-pixels (i j) image
|
||||
(setf (pixel bw-image i j) (if (<= (pixel image i j) median) 1 0)))
|
||||
bw-image))
|
||||
|
||||
(defun main ()
|
||||
(let* ((image (read-jpeg-file "lenna.jpg"))
|
||||
(bw-image (gray->black&white-image (color->gray-image image))))
|
||||
(write-pbm-file "lenna-bw.pbm" bw-image)))
|
||||
14
Task/Bitmap-Histogram/Zkl/bitmap-histogram-1.zkl
Normal file
14
Task/Bitmap-Histogram/Zkl/bitmap-histogram-1.zkl
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
fcn histogram(image){
|
||||
hist:=List.createLong(256,0); // array[256] of zero
|
||||
image.data.howza(0).pump(Void,'wrap(c){ hist[c]+=1 }); // byte by byte loop
|
||||
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
|
||||
}
|
||||
10
Task/Bitmap-Histogram/Zkl/bitmap-histogram-2.zkl
Normal file
10
Task/Bitmap-Histogram/Zkl/bitmap-histogram-2.zkl
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
img:=PPM.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(bw.data.clear(),'wrap(c){ if(c>median) 0xff else 0 });
|
||||
|
||||
bw.write(File("foo.ppm","wb"));
|
||||
Loading…
Add table
Add a link
Reference in a new issue