(notonline)-->
--
-- demo\rosetta\Image_convolution.exw
-- ==================================
--
without js -- imImage, im_width, im_height, im_pixel, IupImageRGB, allocate,
-- imFileImageLoadBitmap, peekNS, wait_key, IupImageFromImImage
include pGUI.e
constant filters = {-- Emboss
{{-2.0, -1.0, 0.0},
{-1.0, 1.0, 1.0},
{ 0.0, 1.0, 2.0}},
-- Sharpen
{{-1.0, -1.0, -1.0},
{-1.0, 9.0, -1.0},
{-1.0, -1.0, -1.0}},
-- Sobel_emboss
{{-1.0, -2.0, -1.0},
{ 0.0, 0.0, 0.0},
{ 1.0, 2.0, 1.0}},
-- Box_blur
{{ 1.0, 1.0, 1.0},
{ 1.0, 1.0, 1.0},
{ 1.0, 1.0, 1.0}},
-- Gaussian_blur
{{1, 4, 7, 4, 1},
{4, 16, 26, 16, 4},
{7, 26, 41, 26, 7},
{4, 16, 26, 16, 4},
{1, 4, 7, 4, 1}}}
function convolute(imImage img, integer fdx)
integer width = im_width(img),
height = im_height(img)
sequence original = repeat(repeat(0,width),height),
new_image,
filterfdx = filters[fdx]
integer fh = length(filterfdx), hh=(fh-1)/2,
fw = length(filterfdx[1]), hw=(fw-1)/2,
divisor = max(sum(filterfdx),1)
for y=height-1 to 0 by -1 do
for x=0 to width-1 do
original[height-y,x+1] = im_pixel(img, x, y)
end for
end for
new_image = original
for y=hh+1 to height-hh-1 do
for x=hw+1 to width-hw-1 do
sequence newrgb = {0,0,0}
for i=-hh to +hh do
for j=-hw to +hw do
newrgb = sq_add(newrgb,sq_mul(filterfdx[i+hh+1,j+hw+1],original[y+i,x+j]))
end for
end for
new_image[y,x] = sq_max(sq_min(sq_floor_div(newrgb,divisor),255),0)
end for
end for
new_image = flatten(new_image) -- (as needed by IupImageRGB)
Ihandle new_img = IupImageRGB(width, height, new_image)
return new_img
end function
IupOpen()
constant w = machine_word(),
TITLE = "Image convolution"
atom pError = allocate(w)
--imImage im1 = imFileImageLoadBitmap("Lenna50.jpg",0,pError)
--imImage im1 = imFileImageLoadBitmap("Lenna100.jpg",0,pError)
--imImage im1 = imFileImageLoadBitmap("Lena.ppm",0,pError)
imImage im1 = imFileImageLoadBitmap("Quantum_frog.png",0,pError)
--imImage im1 = imFileImageLoadBitmap("Quantum_frog.512.png",0,pError)
if im1=NULL then
?{"error opening image",peekNS(pError,w,1)}
{} = wait_key()
abort(0)
end if
--(see also Color_quantization.exw if not an IM_RGB image)
Ihandle dlg,
flt = IupList("DROPDOWN=YES, VALUE=1")
Ihandln image1 = IupImageFromImImage(im1),
image2 = convolute(im1,1),
label1 = IupLabel(),
label2 = IupLabel()
IupSetAttributeHandle(label1, "IMAGE", image1)
IupSetAttributeHandle(label2, "IMAGE", image2)
function valuechanged_cb(Ihandle /*flt*/)
IupSetAttribute(dlg,"TITLE","Working...")
-- IupSetAttributeHandle(label2, "IMAGE", NULL)
image2 = IupDestroy(image2)
image2 = convolute(im1,IupGetInt(flt,"VALUE"))
IupSetAttributeHandle(label2, "IMAGE", image2)
IupSetAttribute(dlg,"TITLE",TITLE)
IupRefresh(dlg)
return IUP_DEFAULT
end function
IupSetCallback(flt,"VALUECHANGED_CB",Icallback("valuechanged_cb"))
IupSetAttributes(flt,`1=Emboss, 2=Sharpen, 3="Sobel emboss", 4="Box_blur", 5=Gaussian_blur`)
IupSetAttributes(flt,"VISIBLEITEMS=6") -- (still dunno why this trick works)
dlg = IupDialog(IupVbox({flt,
IupFill(),
IupHbox({IupFill(),label1, label2,IupFill()}),
IupFill()}))
IupSetAttribute(dlg, "TITLE", TITLE)
IupShow(dlg)
if platform()!=JS then -- (no chance...)
IupMainLoop()
IupClose()
end if