⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 himage.c

📁 This is code tutorial for image processing include:histogram,sketon....
💻 C
字号:


   /************************************************
   *
   *       file himage.c
   *
   *       Functions: This file contains
   *           main
   *           vline
   *           hline
   *
   *       Purpose:
   *          This program calculates the histogram
   *          of an image and puts the picture of
   *          that histogram in an output image.
   *
   *       External Calls:
   *          imageio.c
   *             does_not_exist
   *             create_allocate_tiff_file
   *             create_allocate_bmp_file
   *             get_image_size
   *             allocate_image_array
   *             free_image_array
   *             read_image_array
   *             write_image_array
   *          hist.c
   *             calculate_histogram
   *
   *       Modifications:
   *          7 Arpil 1992 - created
   *         15 August 1998 - modified to work with
   *              an entire image array at once.
   *         22 September 1998 - modified to work with 
   *              all I O routines in imageio.c.
   *
   *************************************************/

#include "cips.h"

#define W    300
#define L    300
#define UP     5
#define LEFT   5
#define SPOT 200


main(argc, argv)
   int  argc;
   char *argv[];
{
   char   *cc;
   int    i, j, amount;
   long   l, w;
   int    ok = 0;
   long   length, width;
   short  **image, **hist;
   struct tiff_header_struct image_header;
   struct bmpfileheader      bmp_file_header;
   struct bitmapheader       bmheader;
   unsigned long histogram[GRAY_LEVELS+1];
   int     count;
   unsigned long max, scale;

   max   = 0;
   count = 0;

   if(argc < 3 ){
      printf(
      "\nusage: himage image-file histogram-file [length width]\n");
      exit(-1);
   }

   if(does_not_exist(argv[1])){
    printf("\nERROR input file %s does not exist",
             argv[1]);
    exit(0);
   }

   if(argc >= 4)
      l = atoi(argv[3]);
   else
      l = L;

   if(argc >= 5)
      w = atoi(argv[4]);
   else
      w = W;

   cc = strstr(argv[2], ".tif");
   if(cc != NULL){  /* create a tif */
      ok = 1;
      image_header.lsb            = 1;
      image_header.bits_per_pixel = 8;
      image_header.image_length   = l;
      image_header.image_width    = w;;
      image_header.strip_offset   = 1000;
      create_allocate_tiff_file(argv[2], 
                                &image_header);
   }  /* ends tif */

   cc = strstr(argv[2], ".bmp");
   if(cc != NULL){  /* create a bmp */
      ok = 1;
      bmheader.height = l;
      bmheader.width  = w;
      create_allocate_bmp_file(argv[2], 
                               &bmp_file_header, 
                               &bmheader);
   }  /* ends tif */

   if(ok == 0){
      printf("\nERROR input file neither tiff nor bmp");
      exit(0);
   }

   get_image_size(argv[1], &length, &width);
   image = allocate_image_array(length, width);
   hist  = allocate_image_array(l, w);
   read_image_array(argv[1], image);

   for(i=0; i<l; i++)
      for(j=0; j<w; j++)
         hist[i][j] = 0;

   for(i=0; i<GRAY_LEVELS+1; i++) histogram[i] = 0;

   calculate_histogram(image, histogram, 
                       length, width);


   hline(hist, l-UP, LEFT, LEFT+GRAY_LEVELS+1);
   vline(hist, LEFT+ 50, l-UP+2, l-UP);
   vline(hist, LEFT+100, l-UP+2, l-UP);
   vline(hist, LEFT+150, l-UP+2, l-UP);
   vline(hist, LEFT+200, l-UP+2, l-UP);
   vline(hist, LEFT+250, l-UP+2, l-UP);

   for(i=0; i<GRAY_LEVELS+1; i++)
      if(histogram[i] > max)
         max = histogram[i];

   if(max > (l-UP-UP))
      scale = max/(l-5*UP);
   else
      scale = 1;

   printf("\n max=%ld scale=%ld",max, scale);

   for(i=0; i<GRAY_LEVELS+1; i++){
      amount = histogram[i]/scale;
      if(amount > 0){
         vline(hist, i+LEFT, l-UP, l-UP-amount);
      }  /* ends if not zero */
   }  /* ends loop over i GRAY_LEVELS */

   write_image_array(argv[2], hist);

   free_image_array(image, length);
   free_image_array(hist, l);

}  /* ends main */





vline(image, ie, il, ll)
   int ie, il, ll;
   short **image;
{
   int i, j;

   for(i=il; i>=ll; i--)
      image[i][ie] = SPOT;

}  /* ends vline */




hline(image, il, ie, le)
   int il, ie, le;
   short **image;
{
   int i, j;

   for(i=ie; i<=le; i++)
      image[il][i] = SPOT;

}  /* ends hline */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -