|
正如所期望的,高能量的地區一般都是邊緣,低能量的地區均是由少量類比色彩(天空)擴充而來的。從這裡我們可以估計到,減少圖片的高度,減少的部分應該大部分都是在天空地區,其他部分保持不變。
下一步決定哪些像素需要進行移除。我們將一個像素一個像素的減少映像的高度,就需要一列一列的找那個像素能夠移除。我們希望找到一系列的具有儘可能最低總能量的像素集合,移除掉這些seam,對整個圖片產生影響最小。可以按如下兩步來確定最佳去除像素點:
// GenerateSeam 返回最優的可以消除的水平 seam.func GenerateSeam(im image.Image) Seam { mat := GenerateCostMatrix(im) return FindLowestCostSeam(mat)}
第一步是用一個八連通地區像素去水平濾波整個映像,獲得包含“seams"的最低積累能量的消耗矩陣。
這次我們首先看如下代碼:
// GenerateCostMatrix 從映像左端到每一個像素,建立一個表明最低消耗seam矩陣.//// mat[x][y] 是從映像左端到列x行y像素點的seam的累積能量.func GenerateCostMatrix(im image.Image) [][]float64 { min, max := im.Bounds().Min, im.Bounds().Max height, width := max.Y-min.Y, max.X-min.X mat := make([][]float64, width) for x := min.X; x < max.X; x++ { mat[x-min.X] = make([]float64, height) } // Initialize first column of matrix for y := min.Y; y < max.Y; y++ { e, _, _, a := im.At(0, y).RGBA() mat[0][y-min.Y] = float64(e) / float64(a) } updatePoint := func(x, y int) { e, _, _, a := im.At(x, y).RGBA() up, down := math.MaxFloat64, math.MaxFloat64 left := mat[x-1][y] if y != min.Y { up = mat[x-1][y-1] } if y < max.Y-1 { down = mat[x-1][y+1] } val := math.Min(float64(left), math.Min(float64(up), float64(down))) mat[x][y] = val + (float64(e) / float64(a)) } // Calculate the remaining columns iteratively for x := min.X + 1; x < max.X; x++ { for y := min.Y; y < max.Y; y++ { updatePoint(x, y) } } return mat} |
hxapp2
翻譯於 2周前
0人頂
頂 翻譯的不錯哦! |