Why is median blur not working? – OpenCV – Python

Question:

I have a function to add gaussian noise to an image read by OpenCV with imread that returns an image (matrix).

I am trying to use median blur on that image but terminal returns this error:

median = cv2.medianBlur(image, 5)
             ^^^^^^^^^^^^^^^^^^^^^^^^
cv2.error: OpenCV(4.7.0) D:/a/opencv-python/opencv-python/opencv/modules/imgproc/src/median_blur.simd.hpp:870: error: (-210:Unsupported format or combination of formats)  in function 'cv::opt_AVX2::medianBlur'

Here’s the code:

import numpy as np
import cv2

def GaussianNoise(image):

    row,col,ch= image.shape

    mean = -10
    var = 200
    sigma = var**0.5

    gauss = np.random.normal(mean,sigma,(row,col,ch))
    gauss = gauss.reshape(row,col,ch)
    gaussImage = image + gauss

    return gaussImage

def ApplyFilters(image):

    median = cv2.medianBlur(image, 5)

    return  median

def CleanImage():
    image = cv2.imread("SampleImages/Sample1.png")

    noiseImage = GaussianNoise(image)
    cleanedImage = ApplyFilters(noiseImage)

    cv2.imshow("Clean image", cleanedImage)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

if __name__ == "__main__":
    CleanImage()

I don’t understand why it says error: (-210:Unsupported format or combination of formats) if it seems to be both valid images (matrixes) and ksize seems to be correct too.

What I am doing wrong?

EDIT: image info is col = 1024 row = 1024 ch = 3 dtype = uint8

Asked By: Benevos

||

Answers:

I forgot to post the solution fmw42 provided.

My mistake was assuming that my image was always uint8, beacuse on this lines:

gauss = gauss.reshape(row,col,ch)
gaussImage = image + gauss

gauss is float64, so when image and gauss are added, the result turns into float64 too.

I read on documentation that medianBlur() accepts only uint8, uint16 and float32.

So, in order to solve this I had to turn gauss to uint8 before its addition (the resultant addition can be turned into uint8 too insted), like this:

gauss = np.random.normal(mean,sigma,(row,col,ch))
gauss = gauss.reshape(row,col,ch).astype("uint8")
gaussImage = image + gauss

My final code will be this one:

import numpy as np
import cv2

def GaussianNoise(image):

    row,col,ch= image.shape

    mean = -10
    var = 200
    sigma = var**0.5

    gauss = np.random.normal(mean,sigma,(row,col,ch))
    gauss = gauss.reshape(row,col,ch).astype("uint8")
    gaussImage = image + gauss

    return gaussImage

def ApplyFilters(image):

    median = cv2.medianBlur(image, 5)

    return  median

def CleanImage():
    image = cv2.imread("SampleImages/Sample1.png")

    noiseImage = GaussianNoise(image)
    cleanedImage = ApplyFilters(noiseImage)

    cv2.imshow("Clean image", cleanedImage)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

if __name__ == "__main__":
    CleanImage()
Answered By: Benevos