#!/usr/bin/env lua

--[[
  =======================
    Morfologice operace  
  =======================

  ===============
  potrebne funkce
  ===============

    cv.LoadImage()        Nacitani obrazku ze souboru
    cv.CloneImage()       Vytvori kopii obrazku
    cv.Get2D()            Nacteni vektoru hodnot z obrazku.
    cv.Threshold()        Prahovani obrazu
    cv.Dilate()           Dilatace obrazu
    cv.Erode()            Eroze obrazu
    cv.MorphologyEx()     Morfologicke operace obrazu
    dilatation()          uzivatelska funkce realizujici dilataci obrazu
    
]]



local cv=require('luacv')

function dilatation(img)
  if (not img) then error("dilatation(img)") end

  -- Provedte prahovani obrazu img do img pomoci knihovni funkce s parametry prahu 120, 255 a cv.CV_THRESH_BINARY

  for i=0,img.width-1 do 
    for j=0,img.height-1 do
      
      -- Ulozte do promenne scalar prvek obrazku img na pozicich i,j

      if (scalar.val[0]==255) then
        if (i~=0) then
          cv.Set2D(img,i-1,j,cv.Scalar(255))
        else
          if (i~=img.width-1) then
            cv.Set2D(img,i+1,j,cv.Scalar(255))
          end
        end
        cv.Set2D(img,i,j,cv.Scalar(255))
      end
    end
  end
end

-- Nactete zdrojovy obrazek biohazard.png do promenne img a pouzijte parametr cv.CV_LOAD_IMAGE_GRAYSCALE 
-- pro nacteni v odstinech sedi

if (not img) then error("can't open file") end

-- Vytvorte kopii obrazu img do promenne copy
-- !!!! prirazeni   copy=img    je pouze melka kopie resp. ukazatel na img !!!

-- Zavolejte uzivatelskou funkci realizujici dilataci obrazu nad obrazkem copy

cv.ShowImage("dilatation",copy)

local se=cv.CreateStructuringElementEx(3,1,1,0,cv.CV_SHAPE_RECT)

cv.Dilate(img,copy,se)
cv.ShowImage("Dilate",copy)

-- Provedte erozi obrazu img do obrazku copy pomoci strukturniho elementu se a po 3 iterace

cv.ShowImage("Erode 3x",copy)

cv.Erode(img,copy,se)
cv.Dilate(copy,copy,se)

cv.ShowImage("Erode&Dilate",copy)

-- Provedte morf. operaci otevreni vstupniho obrazu img do copy pomoci knihovni funkce, strukturniho elementu se, parametru cv.CV_MOP_OPEN 
-- a docasneho uloziste nil

cv.ShowImage("Open",copy)

-- Provedte morf. operaci uzavreni pomoci kombinace Dilatace a Eroze obrazu img se strukturnim elementem se do obrazu copy.
cv.ShowImage("Dilate&Erode",copy)

cv.MorphologyEx(img,copy,nil,se,cv.CV_MOP_CLOSE)
cv.ShowImage("Close",copy)

cv.WaitKey()

cv.ReleaseImage(img)
cv.ReleaseImage(copy)
cv.ReleaseStructuringElement(se)

cv.DestroyAllWindows()
