mirror of
				https://github.com/python-pillow/Pillow.git
				synced 2025-10-31 16:07:30 +03:00 
			
		
		
		
	3x3 kernel
This commit is contained in:
		
							parent
							
								
									b11bba108e
								
							
						
					
					
						commit
						f3a33da9f3
					
				|  | @ -27,6 +27,13 @@ | ||||||
| #include "Imaging.h" | #include "Imaging.h" | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | #ifdef WORDS_BIGENDIAN | ||||||
|  |     #define MAKE_UINT32(u0, u1, u2, u3) (u3 | (u2<<8) | (u1<<16) | (u0<<24)) | ||||||
|  | #else | ||||||
|  |     #define MAKE_UINT32(u0, u1, u2, u3) (u0 | (u1<<8) | (u2<<16) | (u3<<24)) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| static inline UINT8 clip8(float in) | static inline UINT8 clip8(float in) | ||||||
| { | { | ||||||
|     if (in <= 0.0) |     if (in <= 0.0) | ||||||
|  | @ -89,7 +96,7 @@ void | ||||||
| ImagingFilter3x3(Imaging imOut, Imaging im, const float* kernel, | ImagingFilter3x3(Imaging imOut, Imaging im, const float* kernel, | ||||||
|                  float offset) |                  float offset) | ||||||
| { | { | ||||||
| #define KERNEL3x3(in_1, in, in1, kernel, d) ( \ | #define KERNEL3x3(in_1, in, in1, x, kernel, d) ( \ | ||||||
|     (UINT8) in1[x-d]  * kernel[0] + \ |     (UINT8) in1[x-d]  * kernel[0] + \ | ||||||
|     (UINT8) in1[x]    * kernel[1] + \ |     (UINT8) in1[x]    * kernel[1] + \ | ||||||
|     (UINT8) in1[x+d]  * kernel[2] + \ |     (UINT8) in1[x+d]  * kernel[2] + \ | ||||||
|  | @ -100,7 +107,7 @@ ImagingFilter3x3(Imaging imOut, Imaging im, const float* kernel, | ||||||
|     (UINT8) in_1[x]   * kernel[7] + \ |     (UINT8) in_1[x]   * kernel[7] + \ | ||||||
|     (UINT8) in_1[x+d] * kernel[8]) |     (UINT8) in_1[x+d] * kernel[8]) | ||||||
| 
 | 
 | ||||||
|     int x, y = 0; |     int x = 0, y = 0; | ||||||
| 
 | 
 | ||||||
|     memcpy(imOut->image[0], im->image[0], im->linesize); |     memcpy(imOut->image[0], im->image[0], im->linesize); | ||||||
|     if (im->bands == 1) { |     if (im->bands == 1) { | ||||||
|  | @ -112,13 +119,47 @@ ImagingFilter3x3(Imaging imOut, Imaging im, const float* kernel, | ||||||
| 
 | 
 | ||||||
|             out[0] = in0[0]; |             out[0] = in0[0]; | ||||||
|             for (x = 1; x < im->xsize-1; x++) { |             for (x = 1; x < im->xsize-1; x++) { | ||||||
|                 out[x] = clip8(KERNEL3x3(in_1, in, in1, kernel, 1) + offset); |                 float ss = KERNEL3x3(in_1, in, in1, x, kernel, 1); | ||||||
|  |                 out[x] = clip8(ss + offset); | ||||||
|              } |              } | ||||||
|             out[x] = in0[x]; |             out[x] = in0[x]; | ||||||
|         } |         } | ||||||
|     } else if (im->bands == 3) { |     } else { | ||||||
|         printf("%s\n", "hi there"); |  | ||||||
|         for (y = 1; y < im->ysize-1; y++) { |         for (y = 1; y < im->ysize-1; y++) { | ||||||
|  |             UINT8* in_1 = (UINT8*) im->image[y-1]; | ||||||
|  |             UINT8* in0 = (UINT8*) im->image[y]; | ||||||
|  |             UINT8* in1 = (UINT8*) im->image[y+1]; | ||||||
|  |             UINT32* out = (UINT32*) imOut->image[y]; | ||||||
|  | 
 | ||||||
|  |             out[0] = ((UINT32*) in0)[0]; | ||||||
|  |             if (im->bands == 2) { | ||||||
|  |                 for (x = 1; x < im->xsize-1; x++) { | ||||||
|  |                     float ss0 = KERNEL3x3(in_1, in, in1, x*4+0, kernel, 4); | ||||||
|  |                     float ss3 = KERNEL3x3(in_1, in, in1, x*4+3, kernel, 4); | ||||||
|  |                     out[x] = MAKE_UINT32( | ||||||
|  |                         clip8(ss0 + offset), 0, 0, clip8(ss3 + offset)); | ||||||
|  |                 } | ||||||
|  |             } else if (im->bands == 3) { | ||||||
|  |                 for (x = 1; x < im->xsize-1; x++) { | ||||||
|  |                     float ss0 = KERNEL3x3(in_1, in, in1, x*4+0, kernel, 4); | ||||||
|  |                     float ss1 = KERNEL3x3(in_1, in, in1, x*4+1, kernel, 4); | ||||||
|  |                     float ss2 = KERNEL3x3(in_1, in, in1, x*4+2, kernel, 4); | ||||||
|  |                     out[x] = MAKE_UINT32( | ||||||
|  |                         clip8(ss0 + offset), clip8(ss1 + offset), | ||||||
|  |                         clip8(ss2 + offset), 0); | ||||||
|  |                 } | ||||||
|  |             } else if (im->bands == 4) { | ||||||
|  |                 for (x = 1; x < im->xsize-1; x++) { | ||||||
|  |                     float ss0 = KERNEL3x3(in_1, in, in1, x*4+0, kernel, 4); | ||||||
|  |                     float ss1 = KERNEL3x3(in_1, in, in1, x*4+1, kernel, 4); | ||||||
|  |                     float ss2 = KERNEL3x3(in_1, in, in1, x*4+2, kernel, 4); | ||||||
|  |                     float ss3 = KERNEL3x3(in_1, in, in1, x*4+3, kernel, 4); | ||||||
|  |                     out[x] = MAKE_UINT32( | ||||||
|  |                         clip8(ss0 + offset), clip8(ss1 + offset), | ||||||
|  |                         clip8(ss2 + offset), clip8(ss3 + offset)); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             out[x] = ((UINT32*) in0)[x]; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     memcpy(imOut->image[y], im->image[y], im->linesize); |     memcpy(imOut->image[y], im->image[y], im->linesize); | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user