Advertisement
Guest User

Untitled

a guest
Jun 17th, 2019
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.93 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "image"
  6. "image/png"
  7. "log"
  8. "os"
  9.  
  10. "github.com/Arafatk/glot"
  11. "gocv.io/x/gocv"
  12. )
  13.  
  14. func main() {
  15. if len(os.Args) < 2 {
  16. fmt.Println("Enter .jpeg file path for image")
  17. return
  18. }
  19.  
  20. filename := os.Args[1]
  21. src1 := gocv.IMRead(filename, gocv.IMReadGrayScale)
  22. if src1.Empty() {
  23. fmt.Println("Error reading image from: %v", filename)
  24. return
  25. }
  26.  
  27. var (
  28. src = loadImage("123.png")
  29. bounds = src.Bounds()
  30. gray = image.NewGray(bounds)
  31. )
  32. for x := 0; x < bounds.Max.X; x++ {
  33. for y := 0; y < bounds.Max.Y; y++ {
  34. var rgba = src.At(x, y)
  35. gray.Set(x, y, rgba)
  36. }
  37. }
  38.  
  39. threshold := Otsu(gray)
  40. Threshold(gray, threshold, 0, 255)
  41. saveImage("otsu.png", gray)
  42.  
  43. // сравнить полученные результаты ручной реализации отсу и gocv ниже
  44. dest1 := gocv.NewMat()
  45. defer dest1.Close()
  46. gocv.Threshold(src1, &dest1, 128, 225, gocv.ThresholdOtsu)
  47. }
  48.  
  49. func Threshold(m *image.Gray, threshold, bgColor, fgColor uint8) {
  50. count := len(m.Pix)
  51. for i := 0; i < count; i++ {
  52. if m.Pix[i] > threshold {
  53. m.Pix[i] = fgColor
  54. } else {
  55. m.Pix[i] = bgColor
  56. }
  57. }
  58. }
  59.  
  60. func Otsu(m *image.Gray) uint8 {
  61. hist := Histogram(m)
  62. histPlot(hist)
  63. // log.Println("histogram ---- %v \n", hist)
  64.  
  65. sum := 0
  66. for i, v := range hist {
  67. sum += i * v
  68. }
  69. wB, wF := 0, len(m.Pix)
  70. sumB, sumF := 0, sum
  71. maxVariance := 0.0
  72. threshold := uint8(0)
  73. for t := 0; t < 256; t++ {
  74. wB += hist[t]
  75. wF -= hist[t]
  76. if wB == 0 {
  77. continue
  78. }
  79. if wF == 0 {
  80. log.Printf("otsu threshold1 ---- %v \n", threshold)
  81. return threshold
  82. }
  83. sumB += t * hist[t]
  84. sumF = sum - sumB
  85. mB := float64(sumB) / float64(wB)
  86. mF := float64(sumF) / float64(wF)
  87. betweenVariance := float64(wB*wF) * (mB - mF) * (mB - mF)
  88. if betweenVariance > maxVariance {
  89. maxVariance = betweenVariance
  90. threshold = uint8(t)
  91. }
  92. }
  93. log.Printf("otsu threshold2 ---- %v \n", threshold)
  94. return threshold
  95. }
  96.  
  97. func Histogram(m *image.Gray) []int {
  98. hist := make([]int, 256)
  99. count := len(m.Pix)
  100. for i := 0; i < count; i++ {
  101. hist[m.Pix[i]]++
  102. }
  103. return hist
  104. }
  105.  
  106. func histPlot(hist []int) {
  107. dimensions := 2
  108. persist := false
  109. debug := false
  110. plot, _ := glot.NewPlot(dimensions, persist, debug)
  111. pointGroupName := "Simple Circles"
  112. style := "points"
  113. plot.AddPointGroup(pointGroupName, style, hist)
  114. plot.SetTitle("Example Plot")
  115. plot.SetXLabel("X-Axis")
  116. plot.SetYLabel("Y-Axis")
  117. plot.SetXrange(0, 255)
  118. plot.SetYrange(0, 25000)
  119. plot.SavePlot("2.png")
  120. }
  121.  
  122. func loadImage(filename string) image.Image {
  123. f, err := os.Open(filename)
  124. if err != nil {
  125. log.Fatalf("os.Open failed: %v", err)
  126. }
  127. defer f.Close()
  128. img, _, err := image.Decode(f)
  129. if err != nil {
  130. log.Fatalf("image.Decode failed: %v", err)
  131. }
  132. return img
  133. }
  134.  
  135. func saveImage(filename string, img image.Image) {
  136. f, err := os.Create(filename)
  137. if err != nil {
  138. log.Fatalf("os.Create failed: %v", err)
  139. }
  140. defer f.Close()
  141. err = png.Encode(f, img)
  142. if err != nil {
  143. log.Fatalf("png.Encode failed: %v", err)
  144. }
  145. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement