[OpenCV] Chapter02-10 Removing noise using Gaussian, median, bilateral filters

Removing noise using Gaussian, median, bilateral filters

Source Code

package main

import (
 "gocv.io/x/gocv"
 "image"
 "log"
 "math/rand"
)

type Image []float32

func main() {
 imageFilePath := "../../data/Lena.png"
 originalMat := gocv.IMRead(imageFilePath, gocv.IMReadAnyColor)
 if originalMat.Empty() {
  log.Panic("Can not read image: " + imageFilePath)
  return
 }

 originalImage := originalMat.ToBytes()
 originalFloat32Image := convertToFloat32(originalImage)

 // noised
 noisedImage := createNoisedImage(originalFloat32Image)

 noisedMat, err := gocv.NewMatFromBytes(originalMat.Rows(), originalMat.Cols(), gocv.MatTypeCV8UC3, noisedImage)
 if err != nil {
  log.Panic("Can not convert bytes to Mat")
  return
 }

 windowForNoisedImage := gocv.NewWindow("Noised Image")
 defer windowForNoisedImage.Close()
 windowForNoisedImage.IMShow(noisedMat)

 // gaussian
 gaussianBlurMat := gocv.NewMat()
 gocv.GaussianBlur(noisedMat, &gaussianBlurMat, image.Point{X: 7, Y: 7}, 0, 0, gocv.BorderConstant)

 windowForGaussian := gocv.NewWindow("Gaussian Filtered Image")
 defer windowForGaussian.Close()
 windowForGaussian.IMShow(gaussianBlurMat)

 // median
 medianBlurMat := gocv.NewMat()
 gocv.MedianBlur(noisedMat, &medianBlurMat, 7)

 windowForMedian := gocv.NewWindow("Median Filtered Image")
 defer windowForMedian.Close()
 windowForMedian.IMShow(medianBlurMat)

 // bilateral
 bilateralFilterMat := gocv.NewMat()
 gocv.BilateralFilter(noisedMat, &bilateralFilterMat, -1, 0.3, 10)

 windowForBilateralFilter := gocv.NewWindow("BilateralFilter Image")
 defer windowForBilateralFilter.Close()
 windowForBilateralFilter.IMShow(bilateralFilterMat)

 // wait
 for {
  key := gocv.WaitKey(3)
  if key == 27 {
   log.Println("Pressed ESC")
   break
  }
 }
}

func convertToFloat32(original []uint8) Image {
 floatArray := make(Image, len(original))
 for i := 0; i < len(original); i++ {
  floatArray[i] = float32(original[i]) / 255
 }

 return floatArray
}

func convertToUint8(original Image) []uint8 {
 floatArray := make([]uint8, len(original))
 for i := 0; i < len(original); i++ {
  floatArray[i] = uint8(original[i] * 255)
 }

 return floatArray
}

func createNoisedImage(image []float32) []uint8 {
 noised := make(Image, len(image))
 for i := 0; i < len(image); i++ {
  noise := image[i] + 0.2*rand.Float32()
  if noise > 1 {
   noise = 1
  }

  if noise < 0 {
   noise = 0
  }

  noised[i] = noise
 }

 return convertToUint8(noised)
}

Execute Result


Comments

Popular posts from this blog

[OpenCV] What is gocv?

[OpenCV] Chapter01-05 Working with UI elements such as scrollbars in OpenCV window

[OpenCV] How to set up gocv