Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2019
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 5.45 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.     "fmt"
  5.     "github.com/jbuchbinder/gopnm"
  6.     "image"
  7.     "image/color"
  8.     "log"
  9.     "os"
  10.     "sync"
  11.     "time"
  12. )
  13.  
  14. var wg sync.WaitGroup
  15.  
  16. func main() {
  17.     file, err := os.Open("in.pgm")
  18.     if err != nil {
  19.         log.Fatal(err)
  20.     }
  21.  
  22.     img, format, err := image.Decode(file)
  23.  
  24.     fmt.Println("Format: ", format)
  25.  
  26.     if err != nil {
  27.         log.Fatal(err)
  28.     }
  29.  
  30.     outFile, err := os.Create("out.pgm")
  31.     if err != nil {
  32.         log.Fatal(err)
  33.     }
  34.  
  35.     start := time.Now()
  36.     //sec(img)
  37.     newImage := sec(&img)
  38.     elapsed := time.Since(start)
  39.  
  40.     log.Println("Time: ", elapsed)
  41.  
  42.     err = pnm.Encode(outFile, newImage, pnm.PGM)
  43.     if err != nil {
  44.         log.Fatal(err)
  45.     }
  46.  
  47.     start = time.Now()
  48.     //sec(img)
  49.     newImage = async(img)
  50.     elapsed = time.Since(start)
  51.     log.Println("Time: ", elapsed)
  52.  
  53.     outFile, err = os.Create("out2.pgm")
  54.     if err != nil {
  55.         log.Fatal(err)
  56.     }
  57.  
  58.     err = pnm.Encode(outFile, newImage, pnm.PGM)
  59.     if err != nil {
  60.         log.Fatal(err)
  61.     }
  62. }
  63.  
  64. func sec(oldImage *image.Image) image.Image {
  65.     newImage := image.NewGray(image.Rectangle{Max: image.Point{X: 1024, Y: 1024}})
  66.  
  67.     for i := 1; i < 1022; i++ {
  68.         for j := 1; j < 1022; j++ {
  69.             value, _, _, _ := (*oldImage).At(i, j).RGBA()
  70.             up, _, _, _ := (*oldImage).At(i, j-1).RGBA()
  71.             down, _, _, _ := (*oldImage).At(i, j+1).RGBA()
  72.             left, _, _, _ := (*oldImage).At(i-1, j).RGBA()
  73.             right, _, _, _ := (*oldImage).At(i+1, j).RGBA()
  74.  
  75.             value = ((value * 6) / 10) + ((up) / 10) + ((right) / 10) + ((left) / 10) + ((down) / 10)
  76.  
  77.             newImage.SetGray(i, j, color.Gray{Y: (uint8)(value >> 8)})
  78.         }
  79.     }
  80.  
  81.     for i := 1; i < 1022; i++ {
  82.         value, _, _, _ := (*oldImage).At(i, 0).RGBA()
  83.         left, _, _, _ := (*oldImage).At(i-1, 0).RGBA()
  84.         right, _, _, _ := (*oldImage).At(i+1, 0).RGBA()
  85.         down, _, _, _ := (*oldImage).At(i, 1).RGBA()
  86.  
  87.         value = ((value * 6) / 10) + ((right) / 10) + ((left) / 10) + ((down) / 10)
  88.  
  89.         newImage.SetGray(i, 0, color.Gray{Y: (uint8)(value >> 8)})
  90.     }
  91.  
  92.     for i := 1; i < 1022; i++ {
  93.         value, _, _, _ := (*oldImage).At(i, 1023).RGBA()
  94.         left, _, _, _ := (*oldImage).At(i-1, 1023).RGBA()
  95.         right, _, _, _ := (*oldImage).At(i+1, 1023).RGBA()
  96.         up, _, _, _ := (*oldImage).At(i, 1022).RGBA()
  97.  
  98.         value = ((value * 6) / 10) + ((right) / 10) + ((left) / 10) + ((up) / 10)
  99.  
  100.         newImage.SetGray(i, 1023, color.Gray{Y: (uint8)(value >> 8)})
  101.     }
  102.  
  103.     for i := 1; i < 1022; i++ {
  104.         value, _, _, _ := (*oldImage).At(0, i).RGBA()
  105.         up, _, _, _ := (*oldImage).At(0, i-1).RGBA()
  106.         down, _, _, _ := (*oldImage).At(0, i+1).RGBA()
  107.         right, _, _, _ := (*oldImage).At(1, i).RGBA()
  108.  
  109.         value = ((value * 6) / 10) + ((right) / 10) + ((up) / 10) + ((down) / 10)
  110.  
  111.         newImage.SetGray(0, i, color.Gray{Y: (uint8)(value >> 8)})
  112.     }
  113.  
  114.     for i := 1; i < 1022; i++ {
  115.         value, _, _, _ := (*oldImage).At(1023, i).RGBA()
  116.         left, _, _, _ := (*oldImage).At(1022, i).RGBA()
  117.         up, _, _, _ := (*oldImage).At(1023, i+1).RGBA()
  118.         down, _, _, _ := (*oldImage).At(1023, i-1).RGBA()
  119.  
  120.         value = ((value * 6) / 10) + ((up) / 10) + ((left) / 10) + ((down) / 10)
  121.  
  122.         newImage.SetGray(0, i, color.Gray{Y: (uint8)(value >> 8)})
  123.     }
  124.  
  125.     {
  126.         value, _, _, _ := (*oldImage).At(0, 0).RGBA()
  127.         down, _, _, _ := (*oldImage).At(0, 1).RGBA()
  128.         right, _, _, _ := (*oldImage).At(0+1, 0).RGBA()
  129.  
  130.         value = ((value * 6) / 10) + ((right) / 10) + ((down) / 10)
  131.  
  132.         newImage.SetGray(0, 0, color.Gray{Y: (uint8)(value >> 8)})
  133.     }
  134.  
  135.     {
  136.         value, _, _, _ := (*oldImage).At(1023, 0).RGBA()
  137.         down, _, _, _ := (*oldImage).At(1023, 1).RGBA()
  138.         left, _, _, _ := (*oldImage).At(1022, 0).RGBA()
  139.  
  140.         value = ((value * 6) / 10) + ((left) / 10) + ((down) / 10)
  141.  
  142.         newImage.SetGray(1023, 0, color.Gray{Y: (uint8)(value >> 8)})
  143.     }
  144.  
  145.     {
  146.         value, _, _, _ := (*oldImage).At(1023, 1023).RGBA()
  147.         up, _, _, _ := (*oldImage).At(1023, 1022).RGBA()
  148.         left, _, _, _ := (*oldImage).At(1022, 1023).RGBA()
  149.  
  150.         value = ((value * 6) / 10) + ((up) / 10) + ((left) / 10)
  151.  
  152.         newImage.SetGray(1023, 1023, color.Gray{Y: (uint8)(value >> 8)})
  153.     }
  154.  
  155.     {
  156.         value, _, _, _ := (*oldImage).At(0, 1023).RGBA()
  157.         up, _, _, _ := (*oldImage).At(0, 1022).RGBA()
  158.         right, _, _, _ := (*oldImage).At(1, 1023).RGBA()
  159.  
  160.         value = ((value * 6) / 10) + ((up) / 10) + ((right) / 10)
  161.  
  162.         newImage.SetGray(0, 1023, color.Gray{Y: (uint8)(value >> 8)})
  163.     }
  164.  
  165.     return newImage
  166. }
  167.  
  168. func async(oldImage image.Image) image.Image {
  169.     newImage := image.NewGray(image.Rectangle{Max: image.Point{X: 1024, Y: 1024}})
  170.  
  171.     wg.Add(5)
  172.  
  173.     go asyncThread(&oldImage, newImage, 256, 0)
  174.     go asyncThread(&oldImage, newImage, 256, 256)
  175.     go asyncThread(&oldImage, newImage, 256, 512)
  176.     go asyncThread(&oldImage, newImage, 256, 768)
  177.     go asyncThread(&oldImage, newImage, 256, 1024)
  178.  
  179.     wg.Wait()
  180.  
  181.     //time.Sleep(time.Second * 10)
  182.     return newImage
  183. }
  184.  
  185. func asyncThread(oldImage *image.Image, newImage *image.Gray, lines int, start int) {
  186.  
  187.     defer wg.Done()
  188.     for i := start; i < lines + start; i++ {
  189.         for j := 0; j < 1024; j++ {
  190.             value, _, _, _ := (*oldImage).At(i, j).RGBA()
  191.             var up, down, left, right uint32
  192.  
  193.             if i > 0 {
  194.                 up, _, _, _ = (*oldImage).At(i-1, j).RGBA()
  195.             } else {
  196.                 up = 0
  197.             }
  198.  
  199.             if i < 1023 {
  200.                 down, _, _, _ = (*oldImage).At(i+1, j).RGBA()
  201.             } else {
  202.                 down = 0
  203.             }
  204.  
  205.             if j > 0 {
  206.                 left, _, _, _ = (*oldImage).At(i, j-1).RGBA()
  207.             } else {
  208.                 left = 0
  209.             }
  210.  
  211.             if j < 1023 {
  212.                 right, _, _, _ = (*oldImage).At(i, j+1).RGBA()
  213.             } else {
  214.                 right = 0
  215.             }
  216.  
  217.             value = ((value * 6) + (up) + (right) + (left) + (down))/10
  218.  
  219.             newImage.SetGray(i, j, color.Gray{Y: (uint8)(value >> 8)})
  220.         }
  221.     }
  222. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement