image filtering/"revealing" function..

"D Goel" <[email protected]> Thu, 24 Mar 2005 14:53:41 -0500
Newsgroups gmane.comp.gnu.octave.sources
Message-ID <[email protected]>
--=-=-=

I am having fun with images for the first time since yesterday.. so,
please pardon me if this is an already well-known/uniquitous
functionality..

Attached is a file, which focuses on an area of interest in an image,
filters the average color out from that area, and turns up the
contrast, thereby possibly revealing details not visible before; or
improving faint images.


  The use is perhaps best illustrated by trying this: 

imfiltermy  ("submerged-plant.jpg",[.2 .3 .1 .2]) 

 .. where submerged-plant.jpg
   is here:
   http://gnufans.net/~deego/pub/octave/mine/dev/submerged-plant.jpg


  ##
  ##
  ##  Imfilter enhances section of an image by removing the common
  ##  background color in the section of interest, and increasing
  ##  contrast in the the section, is both for interactive use and use
  ##  in programs. A typical interactive session proceeds as follows:
  ##
  ## imfiltermy("subblue.jpg");
  ##
  ## This loads the file, filters a default section and shows the
  ## unfiltered and filtered images.  Next, based on that visual
  ## feedback, you will probably want to adjust the default selection
  ## and call the function again. So, you will write, something like:
  ##
  ## imfiltermy(0,[.4 .6 .3 .4])
  ##
  ## 0 or "" as the first argument tells the function not to bother
  ## reloading, but to use the currently loaded image.
  ##
  ## showp is 1 by default, to enable easy interactive action.
  ##
  ## For example, look at the example file subblue.jpg provided
  ## here.Try,
  ##
  ## imfiltermy ("subblue,jpg",[.2 .75 .35 .7]).
  ##
  ## Not only is the wingspan much clearer, but you can see more detail.
  ## Maximize the window, and you will see a rectangular structure below
  ## and to the right of the wingspan, which was not visible before.
  ##
  ##
  ## For another fun example, try
  ##
  ## imfiltermy("subplants.jpg")
  ##
  ##and imfiltermy("subplants.jpg",[0 1 .6 1])
  ##
  ## MOTIVATION: Imagine a submerged submarine's image, all covered in
  ## blue water. The water is so blue that the ship behind are not too
  ## visible. If only the blue could be filtered out and the contrast
  ## turned up on the remaining image. This is precisely what this
  ## function does. Moreover, we can supply the xy coordinates of the
  ## portion of image we are interested in filtering.    
  ##
  ##  xyxy, if present, is of the form [x1 x2 y1 y2],
  ## where each value lies between 0 and 1, and tells us what part of
  ## the image to focus on. If xyxy is not supplied, we perform a sample
  ## .4 .6 ... in the center.. If xyxy == "all", we take it as 0 1 0 1.
  ## This will successfully work only if the ENTIRE selected area is
  ## more-or less of uniform color, which is then averaged and filtered
  ## out.
  ##
  ##
  ##  The first argument FILE is the path to an image.  Alternatively,
  ##  this can be a cell containing r,g, and b.  This argument can also
  ##  be 0, in which case, we use the last used image.
  ##
  ## The second argument is of the form [x x y y], each value within 0
  ## and 1, which tells what rectangular part of the image to focus on.
  ## The average color to be filtered out from the image is then taken
  ## to be the average of this rectangular selection.  If this argument
  ## is missing, or == "", we use a default selection in the middle. If
  ## this argument =="all", we use the entire image, corresponsing to [0
  ## 1 0 1].
  ##
  ## If the next argument showp is nonzero, we display the final image,
  ## and also the initial image if the initial image was loaded from a
  ## file.
  ##
  ## This function returns the r,g,b matrices of the new image in a
  ## cell.
  ##
  ##
  ## If the final argument, adjparams is supplied and not == "", then it
  ## is a cell of 3 parameters. Each of those parameters is itself a
  ## list (cell) of arguments to be supplied to the imadjust function.
  ## Thus, for example, if you wanted a very white image, you might try:
  ##
  ## imfiltermy("subplants.jpg","","",{{[.8; 1]}, {[.8; 1]}, {[.8;
  ## 1]}});
  ##
  ## xxyy can also be a number between 0 and 1.  In that case, it refers
  ## to the size of the inbound box relative to 1.
  ##
  ## Thus, to quickly see the entire last figure filtered, you can
  ## simply type imfiltermy(0,1); In this sense, this function simply
  ## increases the contrast of the figure to the maximum sensible value.
  ##  To see how this can improve picture/photo contrasts in general,
  ##  try: imfiltermy ("submerged-plant.jpg",1)
  ##
  ## Keywords: enhance image, zoom, filter out, reveal hidden image,
  ## reveal detail, faint.




DG                                 http://gnufans.net/
--

--=-=-=
Content-Type: application/octet-stream
Content-Disposition: attachment; filename=imfiltermy.m

function [rngnbn]=imfiltermy(file,xxyy,showp,adjparams)
  ## Copyright (C) 2005 and onwards D. Goel
  ##
  ## This file is NOT (yet) part of Octave.
  ##
  ## This is free software; you can redistribute it and/or modify it
  ## under the terms of the GNU General Public License as published by
  ## the Free Software Foundation; either version 2, or (at your option)
  ## any later version.
  ##
  ## This software is distributed in the hope that it will be useful,
  ## but WITHOUT ANY WARRANTY; without even the implied warranty of
  ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  ## General Public License for more details.
  ##
  ## You should have received a copy of the GNU General Public License
  ## along with Octave; see the file COPYING.  If not, write to the Free
  ## Software Foundation, 59 Temple Place - Suite 330, Boston, MA
  ## 02111-1307, USA.
  ##
  ##
  ## Author: D. Goel <[email protected]> Created: 24 Mar 2005
  ## Adapted-By:
  ##
  ##function [rngnbn]=imfiltermy(file,xxyy,showp,adjparams)
  ##  Like imadjust, but works for sections of images too.
  ##
  ##  The use is perhaps best illustrated by trying this: imfiltermy
  ##  ("submerged-plant.jpg",[.2 .3 .1 .2]) .. where submerged-plant.jpg
  ##  is here:
  ##  http://gnufans.net/~deego/pub/octave/mine/dev/submerged-plant.jpg
  ##  .. can help *reveal faint or invisible images*.
  ##
  ##
  ##  Imfilter enhances section of an image by removing the common
  ##  background color in the section of interest, and increasing
  ##  contrast in the the section, is both for interactive use and use
  ##  in programs. A typical interactive session proceeds as follows:
  ##
  ## imfiltermy("subblue.jpg");
  ##
  ## This loads the file, filters a default section and shows the
  ## unfiltered and filtered images.  Next, based on that visual
  ## feedback, you will probably want to adjust the default selection
  ## and call the function again. So, you will write, something like:
  ##
  ## imfiltermy(0,[.4 .6 .3 .4])
  ##
  ## 0 or "" as the first argument tells the function not to bother
  ## reloading, but to use the currently loaded image.
  ##
  ## showp is 1 by default, to enable easy interactive action.
  ##
  ## For example, look at the example file subblue.jpg provided
  ## here.Try,
  ##
  ## imfiltermy ("subblue,jpg",[.2 .75 .35 .7]).
  ##
  ## Not only is the wingspan much clearer, but you can see more detail.
  ## Maximize the window, and you will see a rectangular structure below
  ## and to the right of the wingspan, which was not visible before.
  ##
  ##
  ## For another fun example, try
  ##
  ## imfiltermy("subplants.jpg")
  ##
  ##and imfiltermy("subplants.jpg",[0 1 .6 1])
  ##
  ## MOTIVATION: Imagine a submerged submarine's image, all covered in
  ## blue water. The water is so blue that the ship behind are not too
  ## visible. If only the blue could be filtered out and the contrast
  ## turned up on the remaining image. This is precisely what this
  ## function does. Moreover, we can supply the xy coordinates of the
  ## portion of image we are interested in filtering.    
  ##
  ##  xyxy, if present, is of the form [x1 x2 y1 y2],
  ## where each value lies between 0 and 1, and tells us what part of
  ## the image to focus on. If xyxy is not supplied, we perform a sample
  ## .4 .6 ... in the center.. If xyxy == "all", we take it as 0 1 0 1.
  ## This will successfully work only if the ENTIRE selected area is
  ## more-or less of uniform color, which is then averaged and filtered
  ## out.
  ##
  ##
  ##  The first argument FILE is the path to an image.  Alternatively,
  ##  this can be a cell containing r,g, and b.  This argument can also
  ##  be 0, in which case, we use the last used image.
  ##
  ## The second argument is of the form [x x y y], each value within 0
  ## and 1, which tells what rectangular part of the image to focus on.
  ## The average color to be filtered out from the image is then taken
  ## to be the average of this rectangular selection.  If this argument
  ## is missing, or == "", we use a default selection in the middle. If
  ## this argument =="all", we use the entire image, corresponsing to [0
  ## 1 0 1].
  ##
  ## If the next argument showp is nonzero, we display the final image,
  ## and also the initial image if the initial image was loaded from a
  ## file.
  ##
  ## This function returns the r,g,b matrices of the new image in a
  ## cell.
  ##
  ##
  ## If the final argument, adjparams is supplied and not == "", then it
  ## is a cell of 3 parameters. Each of those parameters is itself a
  ## list (cell) of arguments to be supplied to the imadjust function.
  ## Thus, for example, if you wanted a very white image, you might try:
  ##
  ## imfiltermy("subplants.jpg","","",{{[.8; 1]}, {[.8; 1]}, {[.8;
  ## 1]}});
  ##
  ## xxyy can also be a number between 0 and 1.  In that case, it refers
  ## to the size of the inbound box relative to 1.
  ##
  ## Thus, to quickly see the entire last figure filtered, you can
  ## simply type imfiltermy(0,1); In this sense, this function simply
  ## increases the contrast of the figure to the maximum sensible value.
  ##  To see how this can improve picture/photo contrasts in general,
  ##  try: imfiltermy ("submerged-plant.jpg",1)
  ##
  ## Keywords: enhance image, zoom, filter out, reveal hidden image,
  ## reveal detail, faint.

  
  persistent r;
  persistent g;
  persistent b;

  filep=0;
  
  if nargin<1;
    file=0;
  endif

  
  if nargin<2;
    xxyy="";
  endif
  if strcmp(xxyy,"");
    xxyy=[.45 .55 .45 .55];
  elseif strcmp(xxyy,"all");
    xxyy=[0 1 0 1];
  elseif size(xxyy)==1;
    minmin=.5-xxyy/2;
    maxmax=.5+xxyy/2;
    xxyy=[minmin maxmax minmin maxmax];
  endif
  
  if nargin<3;
    showp="";
  endif
  if strcmp(showp,"");
    showp=1;
  endif



  if isstr(file)&not(strcmp(file,""));
    filep=1;
    [r g b]=imread(file);
  elseif iscell(file)
    r=file{1};
    g=file{2};
    b=file{3};
  else
    "ok"; ## persistent
  endif
  ## by now, we have an image in memory..

  cachedp=1;

  if showp&filep;
    disp("Displaying original image..");
    imshow(r,g,b);
    disp("Displaying original image..done");
  endif



  xlen=columns(r);
  ylen=rows(r);

  xmin=ceil(xlen*xxyy(1));
  xmax=ceil(xlen*xxyy(2));

  if xmin==0;
    xmin++;
  endif

  if xmin==xmax;
    xmin=xmax-1;
  endif

  ymin=ceil(ylen*xxyy(3));
  ymax=ceil(ylen*xxyy(4));

  if ymin==0;
    ymin++;
  endif

  if ymin==ymax;
    ymin=ymax-1;
  endif

  ## r of interest:
  rint=r(ymin:ymax,xmin:xmax);
  gint=g(ymin:ymax,xmin:xmax);
  bint=b(ymin:ymax,xmin:xmax);
  
  

#   if nargin<4;
#     b0=mean(bint(:));
#     g0=mean(gint(:));
#     r0=mean(rint(:));
#   else
#     r0=r0g0b0(1);
#     g0=r0g0b0(2);
#     b0=r0g0b0(3);
#   endif

  
  norml=255;

  if nargin<4;
    adjparams=""
  endif
  if not(iscell(adjparams));
    rn1=norml*imadjust(rint);
    gn1=norml*imadjust(gint);
    
    bn1=norml*imadjust(bint);
  else
    adj=adjparams(:);
    lenad=length(adj{1});
    lenad1=1+lenad;
    rb1=gb1=bb1=cell(lenad1,1);
    rb1{1}=rint;
    gb1{1}=gint;
    bb1{1}=bint;
    ## note round brackets!
    rb1(2:lenad1)=adj{1};
    gb1(2:lenad1)=adj{2};
    rb1(2:lenad1)=adj{3};

    ##    disp(rb1)
    ##"dfdffdf"
    ##pause
    rn1=norml*leval('imadjust',rb1);
    bn1=norml*leval('imadjust',bb1);
    gn1=norml*leval('imadjust',gb1);
  endif

  rn=r;
  gn=g;
  bn=b;
  
  
  rn(ymin:ymax,xmin:xmax)=rn1;
  gn(ymin:ymax,xmin:xmax)=gn1;
  bn(ymin:ymax,xmin:xmax)=bn1;
  
  
  


  if showp
    disp("Displaying final image..");
    imshow(rn,gn,bn);
    disp("Displaying final image..done");
  endif
  
  if nargout>0;
    rngnbn={rn,gn,bn};
  endif


endfunction

--=-=-=--