The Kuwahara filter is a non-linear smoothing filter used in image processing for adaptive noise reduction. Most filters that are used for image smoothing are linear low-pass filters that effectively reduce noise but also blur out the edges. However the Kuwahara filter is able to apply smoothing on the image while preserving the edges. It is named after Michiyoshi Kuwahara, Ph.D., who worked at Kyoto and Osaka Sangyo Universities in Japan, developing early medical imaging of dynamic heart muscle in the 1970s and 80s.
Suppose that
I(x,y)
2a+1
(x,y)
Qi=1
Qi(x,y)=\begin{cases} \left[x,x+a\right] x \left[y,y+a\right]&ifi=1\\ \left[x-a,x\right] x \left[y,y+a\right]&ifi=2\\ \left[x-a,x\right] x \left[y-a,y\right]&ifi=3\\ \left[x,x+a\right] x \left[y-a,y\right]&ifi=4\\ \end{cases}
where
x
mi(x,y)
\sigmai(x,y)
\Phi(x,y)
(x,y)
i=\operatorname{argmin}j\sigmaj(x,y)
This means that the central pixel will take the mean value of the area that is most homogenous. The location of the pixel in relation to an edge plays a great role in determining which region will have the greater standard deviation. If for example the pixel is located on a dark side of an edge it will most probably take the mean value of the dark region. On the other hand, should the pixel be on the lighter side of an edge it will most probably take a light value. On the event that the pixel is located on the edge it will take the value of the more smooth, least textured region. The fact that the filter takes into account the homogeneity of the regions ensures that it will preserve the edges while using the mean creates the blurring effect.
Similarly to the median filter the Kuwahara filter uses a sliding window approach to access every pixel in the image. The size of the window is chosen in advance and may vary depending on the desired level of blur in the final image. Bigger windows typically result in the creation of more abstract images whereas small windows produce images that retain their detail. Typically windows are chosen to be square with sides that have an odd number of pixels for symmetry. However, there are variations of the Kuwahara filter that use rectangular windows. Additionally, the subregions do not need to overlap or have the same size as long as they cover all of the window.
For color images, the filter should not be performed by applying the filter to each RGB channel separately, and then recombining the three filtered color channels to form the filtered RGB image. The main problem with that is that the quadrants will have different standard deviations for each of the channels. For example, the upper left quadrant may have the lowest standard deviation in the red channel, but the lower right quadrant may have the lowest standard deviation in the green channel. This situation would result in the color of the central pixel to be determined by different regions, which might result in color artifacts or blurrier edges.
To overcome this problem, for color images a slightly modified Kuwahara filter must be used. The image is first converted into another color space, the HSV color space. The modified filter then operates on only the "brightness" channel, the Value coordinate in the HSV model. The variance of the "brightness" of each quadrant is calculated to determine the quadrant from which the final filtered color should be taken from. The filter will produce an output for each channel which will correspond to the mean of that channel from the quadrant that had the lowest standard deviation in "brightness". This ensures that only one region will determine the RGB values of the central pixel.
ImageMagick uses a similar approach, but using the Rec. 709 Luma as the brightness metric.[1]
"Computes an average color from a list of colors"rgbAverage(colors) = RGB(sum(map(c -> c.r, colors)) / length(colors), sum(map(c -> c.g, colors)) / length(colors), sum(map(c -> c.b, colors)) / length(colors));
""" kuwahara(I, window_size)
Applies the kuwahara filter to an image `I`, using a window square of size `window_size`"""function kuwahara(I, window_size) # Converts the image to a hsv colorspace # (needed to run on colored images) hsv = HSV.(I) # Gets the brightness value as values[y, x] values = channelview(float.(hsv))[3,:,:] # For Rec.601 Luma, replace the above two lines with: # values = Gray.(I)
# Create an empty image of the same dimensions as the input resulting_image = similar(I)
# The size of each quadrant of the window quadrant_size = Int(ceil(window_size / 2))
# (y, x) loop over the original image for y in 1:size(I, 1) for x in 1:size(I, 2) # The top left position of the window tl_x = x - (window_size ÷ 2) tl_y = y - (window_size ÷ 2)
# Function that keeps a number between 1 and the image size # (makes sure all the positions we're using are valid) c1(i) = map(j -> clamp(j, 1, size(values,1)), i) c2(i) = map(j -> clamp(j, 1, size(values,2)), i)
# The positions of each quadrant quadrant_a = [c1(tl_y:quadrant_size+tl_y), c2(tl_x:tl_x+quadrant_size)] quadrant_b = [c1(tl_y:quadrant_size+tl_y), c2(tl_x+quadrant_size:tl_x+window_size)] quadrant_c = [c1(tl_y+quadrant_size:tl_y+window_size), c2(tl_x:tl_x+quadrant_size)] quadrant_d = [c1(tl_y+quadrant_size:tl_y+window_size), c2(tl_x+quadrant_size:tl_x+window_size)]
# Standard deviation of each quadrant σ_a = std(values[quadrant_a...]) σ_b = std(values[quadrant_b...]) σ_c = std(values[quadrant_c...]) σ_d = std(values[quadrant_d...])
# Select the quadrant with the smallest standard deviation quadrants = [quadrant_a, quadrant_b, quadrant_c, quadrant_d] min = argmin([σ_a, σ_b, σ_c, σ_d]) quadrant = quadrants[min]
# The pixel we're processing receives the average of the quadrant pixels = I[quadrant...] resulting_image[y, x] = rgbAverage(pixels) end end
return resulting_imageend
url = "https://upload.wikimedia.org/wikipedia/commons/7/73/Lion_waiting_in_Namibia.jpg"download(url, "lion.jpg")
img = load("lion.jpg")window_size = 13
result = kuwahara(img, window_size)save("result.png", result)
Originally the Kuwahara filter was proposed for use in processing RI-angiocardiographic images of the cardiovascular system. The fact that any edges are preserved when smoothing makes it especially useful for feature extraction and segmentation and explains why it is used in medical imaging. The Kuwahara filter however also finds many applications in artistic imaging and fine-art photography due to its ability to remove textures and sharpen the edges of photographs. The level of abstraction helps create a desirable painting-like effect in artistic photographs especially in the case of the colored image version of the filter. These applications have known great success and have encouraged similar research in the field of image processing for the arts.
Although the vast majority of applications have been in the field of image processing there have been cases that use modifications of the Kuwahara filter for machine learning tasks such as clustering.
The Kuwahara filter has been implemented in CVIPtools.[2]
The Kuwahara filter despite its capabilities in edge preservation has certain drawbacks.
D
The success of the Kuwahara filter has spurred an increase the development of edge-enhancing smoothing filters. Several variations have been proposed for similar use most of which attempt to deal with the drawbacks of the original Kuwahara filter.
The "Generalized Kuwahara filter" proposed by P. Bakker considers several windows that contain a fixed pixel. Each window is then assigned an estimate and a confidence value. The value of the fixed pixel then takes the value of the estimate of the window with the highest confidence. This filter is not characterized by the same ambiguity in the presence of noise and manages to eliminate the block artifacts.
The "Mean of Least Variance"(MLV) filter, proposed by M.A. Schulze also produces edge-enhancing smoothing results in images. Similarly to the Kuwahara filter it assumes a window of size
2d-1 x 2d-1
d x d
d x d
d2
The "Adaptative Kuwahara filter", proposed by K. Bartyzel, is a combination of the anisotropic Kuwahara filter and the adaptative median filter. In comparison with the standard Kuwahara filter, both the objects and the edges retain a better quality. As opposed to the standard Kuwahara filter, the window size is changing, depending on the local properties of the image. For each of the four basic areas surrounding a pixel, the mean and variance are calculated. Then, the window size of each of the four basic areas is increased by 1. If the variance of a new window is smaller than before the resizing of the filter window, then the mean and variance of the basic area will take the newly calculated values. The window size continues to be increased until the new variance is greater than the previous one, or the maximum allowable window size is reached. The variance of the four areas are then compared, and the value of the output pixel is the average value of the basic area for which the variance was the smallest.
A more recent attempt in edge-enhancing smoothing was also proposed by J. E. Kyprianidis. The filter's output is a weighed sum of the local averages with more weight given the averages of more homogenous regions.