🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: comp.soft-sys.khoros
Article #1093

Bug? and correction in lvmdilate

#1093
From: John C. Schultz
Date: Fri, 22 Jan 1993 16:35
157 lines
5540 bytes
lvmdilate.c (src/vipl/Lib) produces a result which is shifted wrt to
the original image by 1/2 of the kernel dimensions.  This is a bug in
my opinion.

The following diff can be applied with patch to fix lvmdilate.c

vmdilate will now work exactly for odd kernels and shift the image
down and to the right by 1 pixel for even kernels.  Note that this may
not be compatible with vmerode, vmcdilate, ... but the patched version
is correct in IMHO.

e.g. 
     00000                          00000              00000
     00000     111                  01110              00000
     00100   w 111  will generate   01110  rather than 00111
     00000     111                  01110              00111
     00000                          00000              00111

     00000                           00000
     00000     1111                  01111
     00100   w 1111  will generate   01111
     00000     1111                  01111
     00000                           00000




*** /usr/khoros/src/vipl/Lib/lvmdilate.c	Fri Mar 20 17:04:10 1992
--- lvmdilate.c	Fri Jan 22 10:05:34 1993
***************
*** 209,215 ****
      c3 = result;
  
      k = nc * nr;                                /* Normal operation count */
!     for (j=0;j<k;j++) *(c3 +j)=0;
  
  
      for (i=0;i<nr;i++) {
--- 209,215 ----
      c3 = result;
  
      k = nc * nr;                                /* Normal operation count */
!     bzero(c3, k * sizeof(unsigned char));
  
  
      for (i=0;i<nr;i++) {
***************
*** 218,229 ****
  
              if (*(c1+i*nc+j) != 0) {
             
!                 for (ii=0;ii<kernr;ii++) {
  
-                     iii = i+ii+starti;
                      if (iii<0 || iii>=nr) continue;
!                     for (jj=0; jj<kernc; jj++) {
!                         jjj = j+jj+startj;
                          if ( jjj>=0 && jjj<nc ) 
                             if (*(c2+ii*kernc+jj) != 0) 
                                 *(c3+ iii*nc + jjj) = 255;
--- 218,230 ----
  
              if (*(c1+i*nc+j) != 0) {
             
!                 for (ii = 0; ii < kernr; ii++) {
!                     iii = i+ii+starti + ((kernr & 0X01) ? -kernr/2 : -kernc/2 + 1);
  
                      if (iii<0 || iii>=nr) continue;
!                     for (jj = 0; jj < kernc; jj++) {
! 
!                         jjj = j+jj+startj + ((kernc & 0X01) ? -kernc/2 : -kernc/2 + 1);
                          if ( jjj>=0 && jjj<nc ) 
                             if (*(c2+ii*kernc+jj) != 0) 
                                 *(c3+ iii*nc + jjj) = 255;
***************
*** 234,240 ****
          }
      c1 = (unsigned char *) image->imagedata;
      c3 = result;
!     for (i=0;i<k;i++) *c1++ = *c3++;
  
  
      free(result);
--- 235,241 ----
          }
      c1 = (unsigned char *) image->imagedata;
      c3 = result;
!     bcopy(c3, c1, k * sizeof(unsigned char));
  
  
      free(result);*** lvmdilate.c	Fri Jan 22 10:05:34 1993
--- /usr/khoros/src/vipl/Lib/lvmdilate.c	Fri Mar 20 17:04:10 1992
***************
*** 209,215 ****
      c3 = result;
  
      k = nc * nr;                                /* Normal operation count */
!     bzero(c3, k * sizeof(unsigned char));
  
  
      for (i=0;i<nr;i++) {
--- 209,215 ----
      c3 = result;
  
      k = nc * nr;                                /* Normal operation count */
!     for (j=0;j<k;j++) *(c3 +j)=0;
  
  
      for (i=0;i<nr;i++) {
***************
*** 218,230 ****
  
              if (*(c1+i*nc+j) != 0) {
             
!                 for (ii = 0; ii < kernr; ii++) {
!                     iii = i+ii+starti + ((kernr & 0X01) ? -kernr/2 : -kernc/2 + 1);
  
                      if (iii<0 || iii>=nr) continue;
!                     for (jj = 0; jj < kernc; jj++) {
! 
!                         jjj = j+jj+startj + ((kernc & 0X01) ? -kernc/2 : -kernc/2 + 1);
                          if ( jjj>=0 && jjj<nc ) 
                             if (*(c2+ii*kernc+jj) != 0) 
                                 *(c3+ iii*nc + jjj) = 255;
--- 218,229 ----
  
              if (*(c1+i*nc+j) != 0) {
             
!                 for (ii=0;ii<kernr;ii++) {
  
+                     iii = i+ii+starti;
                      if (iii<0 || iii>=nr) continue;
!                     for (jj=0; jj<kernc; jj++) {
!                         jjj = j+jj+startj;
                          if ( jjj>=0 && jjj<nc ) 
                             if (*(c2+ii*kernc+jj) != 0) 
                                 *(c3+ iii*nc + jjj) = 255;
***************
*** 235,241 ****
          }
      c1 = (unsigned char *) image->imagedata;
      c3 = result;
!     bcopy(c3, c1, k * sizeof(unsigned char));
  
  
      free(result);
--- 234,240 ----
          }
      c1 = (unsigned char *) image->imagedata;
      c3 = result;
!     for (i=0;i<k;i++) *c1++ = *c3++;
  
  
      free(result);
--
   John C. Schultz   +1 (612) 733-4047   schultz@halley.serc.3m.com
   How to include the taste of Glendronach in a multi-media system?
Technical Details
Message-ID: <SCHULTZ.93Jan22103126@halley.est.3m.com>
Path: arc1-ca.pugleaf.net!sparky!uunet!timbuk.cray.com!mmc.mmmg.com!mmm.serc.3m.com!news

Show Full Headers
Complete Article Headers
Newsgroups: comp.soft-sys.khoros
Path: arc1-ca.pugleaf.net!sparky!uunet!timbuk.cray.com!mmc.mmmg.com!mmm.serc.3m.com!news
From: schultz@halley.est.3m.com (John C. Schultz)
Subject: Bug? and correction in lvmdilate
Message-ID: <SCHULTZ.93Jan22103126@halley.est.3m.com>
Sender: news@mmm.serc.3m.com
Organization: 3M Company, 3M Center, Minnesota, USA
Distribution: comp
Date: Fri, 22 Jan 93 16:35:09 GMT
Lines: 157