2
$\begingroup$

enter image description hereI'm using kernel convolution in python to blur an image, but in addition to blurring it also turns the image darker. Could someone explain why it happens?

def convolve(pixel, kernel, i, j):
R = 0
G = 0
B = 0
if i<2 or j<2 or i>=height-2 or j>=width-2:
    R = pixel[i][j][0]
    G = pixel[i][j][1]
    B = pixel[i][j][2]
else:
    # pixel[][][R/G/B]
    R = (
    pixel[i-2][j-2][0] * kernel[0][0] + pixel[i-2][j-1][0] * kernel[0][1] + pixel[i-2][j][0] * kernel[0][2] + pixel[i-2][j+1][0] * kernel[0][3] + pixel[i-2][j+2][0] * kernel[0][4] + 
    pixel[i-1  ][j-2][0] * kernel[1][0] + pixel[i-1  ][j-1  ][0] * kernel[1][1] +pixel[i-1  ][j][0] * kernel[1][2] + pixel[i-1  ][j+1][0] * kernel[1][3] + pixel[i-1  ][j+2][0] * kernel[1][4] +
    pixel[i][j-2][0] * kernel[2][0] + pixel[i][j-1][0] * kernel[2][1] + pixel[i][j][0] * kernel[2][2] + pixel[i][j+1][0] * kernel[2][3] + pixel[i][j+2][0] * kernel[2][4]
    )

    G = (
    pixel[i-2][j-2][1] * kernel[0][0] + pixel[i-2][j-1][1] * kernel[0][1] + pixel[i-2][j][1] * kernel[0][2] + pixel[i-2][j+1][1] * kernel[0][3] + pixel[i-2][j+2][1] * kernel[0][4] + 
    pixel[i-1  ][j-2][1] * kernel[1][0] + pixel[i-1  ][j-1  ][1] * kernel[1][1] +pixel[i-1  ][j][1] * kernel[1][2] + pixel[i-1][j+1][1] * kernel[1][3] + pixel[i-1  ][j+2][1] * kernel[1][4] +
    pixel[i][j-2][1] * kernel[2][0] + pixel[i][j-1][1] * kernel[2][1] + pixel[i][j][1] * kernel[2][2] + pixel[i][j+1][1] * kernel[2][3] + pixel[i][j+2][1] * kernel[2][4]
    )

    B = (
    pixel[i-2][j-2][2] * kernel[0][0] + pixel[i-2][j-1][2] * kernel[0][1] + pixel[i-2][j][2] * kernel[0][2] + pixel[i-2][j+1][2] * kernel[0][3] + pixel[i-2][j+2][2] * kernel[0][4] + 
    pixel[i-1  ][j-2][2] * kernel[1][0] + pixel[i-1  ][j-1][2] * kernel[1][1] +pixel[i-1][j][2] * kernel[1][2] + pixel[i-1][j+1][2] * kernel[1][3] + pixel[i-1  ][j+2][2] * kernel[1][4] +
    pixel[i][j-2][2] * kernel[2][0] + pixel[i][j-1][2] * kernel[2][1] + pixel[i][j][2] * kernel[2][2] + pixel[i][j+1][2] * kernel[2][3] + pixel[i][j+2][2] * kernel[2][4]
    )

# if <0, then 0
R = R*(R>0)
G = G*(G>0)
B = B*(B>0)

R = R if R<256 else 255
G = G if G<256 else 255
B = B if B<256 else 255


# if >255, then 255
if R<0 or R>255 or G<0 or G>255 or B<0 or B>255:
    print(R, G, B)
return (round(R),round(G),round(B))

The kernel I'm using is a 5x5 gaussian blur from wikipedia

$\endgroup$
  • 2
    $\begingroup$ Please edit the question to include two images that demonstrate your kernel convolution "turns the image darker". Do you have any idea why? $\endgroup$ – Apass.Jack Mar 17 at 12:24
  • $\begingroup$ I'm not sure why, I added images of before and after the convolution $\endgroup$ – Anila Mar 17 at 20:40
2
$\begingroup$

Your image appears darker because standard RGB is used in transformation, with problem inherent to color - grayscale conversion as standard RGB transformation does not preserve luminance.

Simple modification is to switch RGB channels to color space using perceived luminance: $Y = 0.299*R + 0.587*G + 0.114*B$. That way, luminance and chrominance blurring will not result in darkenning or artificial color bleeding.

Color spaces like Y'UV or RGB are non-linear, so make sure to use linear one, say sRGB or any perception-aware/ linear space.

If you can trade speed with accuracy, floating-point box filters are visualy better. Given 5x5 blur is tempting, but does not approximate Gaussian Blur accurately enough.

Something is wrong with your code.
Images appears darker by bad color space, but not that much. I took python code found here as is, and took your image, the result is darker in my opinion, but not visible to the point of shadow dark. Gaussian blur 5x5 I haven't seen your picture while writting answer but, it seems to me that divisor used is bigger than sum of cell values.

$\endgroup$
  • 1
    $\begingroup$ Thank you so much for your reply! $\endgroup$ – Anila Mar 19 at 5:04

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.