查看完整版本 : Lanczos Resampling

Susan﹏汪汪 2017-2-5 19:15

練習[code]public func LanczosResampling<T: SDTransformProtocol>(_ source: [Float], _ s_width: Int, _ a: Int, _ width: Int, _ height: Int, _ transform: T) -> [Float] {
   
    func _kernel(_ x: Float) -> Float {
        let a = Float(a)
        if x == 0 {
            return 1
        }
        if x < -a {
            return 0
        }
        if x < a {
            let _x = Float.pi * x
            return a * sin(_x) * sin(_x / a) / (_x * _x)
        }
        return 0
    }
   
    var result = [Float](repeating: 0, count: width * height)
   
    let s_height = source.count / s_width
   
    let _transform = transform.inverse
   
    for i in 0..<result.count {
        
        let p1 = Point(x: i % width, y: i / width) * _transform
        
        var s: Float = 0
        var t: Float = 0
        
        let min_x = Int(p1.x) - a + 1
        let max_x = Int(p1.x) + a
        let min_y = Int(p1.y) - a + 1
        let max_y = Int(p1.y) + a
        
        for y in min_y...max_y where (0..<s_height).contains(y) {
            let _y = y * s_width
            for x in min_x...max_x where (0..<s_width).contains(x) {
                let l = _kernel(Float((p1 - Point(x: x, y: y)).magnitude))
                s += source[x + _y] * l
                t += l
            }
        }
        result[i] = s / t
    }
   
    return result
}[/code]

sswroom 2017-2-6 14:14

[quote]原帖由 [i]Susan﹏汪汪[/i] 於 2017-2-5 07:15 PM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=455889829&ptid=26426434][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]
練習public func LanczosResampling(_ source: , _ s_width: Int, _ a: Int, _ width: Int, _ height: Int, _ transform: T) ->  {
   
    func _kernel(_ x: Float) -> Float {
        let a = Float(a)
    ... [/quote]邊位和角位的Pixel有Undersampling的問題, 一般是用Repeating sample來解決, 而不是Skip Sampling

這句Float((p1 - Point(x: x, y: y)).magnitude)不肯定有沒有問題

你是用2D Lanczos Resampling, 跟一般常用的Bidirectional Lanczos Resampling不同, 速度會較慢

Susan﹏汪汪 2017-2-6 14:48

[quote]原帖由 [i]sswroom[/i] 於 2017-2-6 02:14 PM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=455931866&ptid=26426434][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]

這句Float((p1 - Point(x: x, y: y)).magnitude)不肯定有沒有問題
[/quote]wiki條式係咁[img]https://wikimedia.org/api/rest_v1/media/math/render/svg/72c75a9ff84381b88606ea7855818585d2e73a03[/img]

Susan﹏汪汪 2017-2-6 14:50

不過依然唔知邊個位計錯

應該跟足左條式

sswroom 2017-2-6 15:50

[quote]原帖由 [i]Susan﹏汪汪[/i] 於 2017-2-6 02:50 PM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=455933776&ptid=26426434][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]
不過依然唔知邊個位計錯

應該跟足左條式 [/quote]不太明白有甚麼問題......

Susan﹏汪汪 2017-2-6 16:00

[quote]原帖由 [i]sswroom[/i] 於 2017-2-6 03:50 PM 發表 [url=http://www.discuss.com.hk/redirect.php?goto=findpost&pid=455936617&ptid=26426434][img]http://www.discuss.com.hk/images/common/back.gif[/img][/url]
不太明白有甚麼問題...... [/quote]
有冇軟件計汪汪張圖?

sswroom 2017-2-6 16:43

[quote]原帖由 [i]Susan﹏汪汪[/i] 於 2017-2-6 04:00 PM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=455937083&ptid=26426434][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]

有冇軟件計汪汪張圖? [/quote]差不多全部程式都是用Bi-directional Lanczos Resampler, 不是用2D Lanczos Resampler, 所以結果會不一樣.....

Susan﹏汪汪 2017-2-6 16:50

Ringing 好嚴重

Susan﹏汪汪 2017-2-6 16:53

Linear Interpolate
[attach]6477766[/attach]Cosine Interpolate
[attach]6477765[/attach]

sswroom 2017-2-6 17:17

[quote]原帖由 [i]Susan﹏汪汪[/i] 於 2017-2-6 04:50 PM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=455939405&ptid=26426434][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]
Ringing 好嚴重 [/quote]之前直接在Browser Drag and Drop開張圖片, 顏色變很怪.....

Susan﹏汪汪 2017-2-6 18:04

[quote]原帖由 [i]sswroom[/i] 於 2017-2-6 05:17 PM 發表 [url=http://www.discuss.com.hk/redirect.php?goto=findpost&pid=455940579&ptid=26426434][img]http://www.discuss.com.hk/images/common/back.gif[/img][/url]
之前直接在Browser Drag and Drop開張圖片, 顏色變很怪..... [/quote]
你張圖都仲係啞左色

但你個ringing冇汪汪果個咁嚴重
可能汪汪真係計錯?

Susan﹏汪汪 2017-2-6 18:07

bicubic

Susan﹏汪汪 2017-2-6 18:32

今日寫的算法都係呢到

https://github.com/SusanDoggie/Doggie/blob/master/Sources/Doggie/Image/Image.swift

Interpolate function係呢到(以前研究音樂時寫的)
https://github.com/SusanDoggie/Doggie/blob/master/Sources/Doggie/Maths/Maths.swift

基本上全部算法用GPU寫都冇難度
Lanczos sampling唔清楚有冇計算錯
如果冇錯的話用GPU寫lanczos的難度同寫linear完全冇分別(只係換個kernel 而已)

[[i] 本帖最後由 Susan﹏汪汪 於 2017-2-6 06:35 PM [url=http://www.discuss.com.hk/iphone][img=100,23]http://i.discuss.com.hk/d/images/r10/iphoneD.jpg [/img][/url] 編輯 [/i]]

Susan﹏汪汪 2017-2-6 18:43

話說
Swift 如果有做specialize的話
速度可以快超過5倍
[url=https://github.com/SusanDoggie/Doggie/commit/1265a1837183f17e21ff920b55dac66c9b2514e4]https://github.com/SusanDoggie/Doggie/commit/1265a1837183f17e21ff920b55dac66c9b2514e4[/url]

基本上冇乜特別做優化
計算上面堆圖(1000px * 1000px)的時間分別
linear: 0.9秒
cosine: 0.9秒
cubic: 1.1秒
lanczos 3: 2.7秒

sswroom 2017-2-6 19:02

[quote]原帖由 [i]Susan﹏汪汪[/i] 於 2017-2-6 06:04 PM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=455942656&ptid=26426434][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]

你張圖都仲係啞左色

但你個ringing冇汪汪果個咁嚴重
可能汪汪真係計錯? [/quote]
是Browser問題...... 我用Photoshop和其他Support Color Management的Viewer看也沒有「啞左色」, 檔案內有標籤成sRGB Colorspace, 可能是Browser不Support

我是用Bi-directional Lanczos Resampling (Linear Sampling), 所以速度比較快, 全CPU Resize, 1920x1080 -> 3840x2160, 時間少於0.017秒 (1/60秒), 用Quad-channel RAM的電腦可以更快

Susan﹏汪汪 2017-2-6 19:16

[quote]原帖由 [i]sswroom[/i] 於 2017-2-6 07:02 PM 發表 [url=http://www.discuss.com.hk/redirect.php?goto=findpost&pid=455945071&ptid=26426434][img]http://www.discuss.com.hk/images/common/back.gif[/img][/url]

是Browser問題...... 我用Photoshop和其他Support Color Management的Viewer看也沒有「啞左色」, 檔案內有標籤成sRGB Colorspace, 可能是Browser不Support

我是用Bi-directional Lanczos Resampling (Linear Sa ... [/quote]
呢幾日如果得閒就挑戰0.017秒

sswroom 2017-2-6 19:29

[quote]原帖由 [i]Susan﹏汪汪[/i] 於 2017-2-6 07:16 PM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=455945612&ptid=26426434][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]

呢幾日如果得閒就挑戰0.017秒 [/quote]我的0.017秒是包括Inverse Gamma, Forward Gamma等時間 (因為是用Linear Sampling方式)

實際上還包括Video Decoding 和Image Presentation等時間.......

要大量的Optimization才有可能提升至這個速度

Susan﹏汪汪 2017-2-6 19:40

[quote]原帖由 [i]sswroom[/i] 於 2017-2-6 07:29 PM 發表 [url=http://www.discuss.com.hk/redirect.php?goto=findpost&pid=455946105&ptid=26426434][img]http://www.discuss.com.hk/images/common/back.gif[/img][/url]
我的0.017秒是包括Inverse Gamma, Forward Gamma等時間 (因為是用Linear Sampling方式)

實際上還包括Video Decoding 和Image Presentation等時間.......

要大量的Optimization才有可能提升至這個速度 [/quote]
放心

冇記錯汪汪部電腦的spec應該差過你果部好多

sswroom 2017-2-6 20:51

[quote]原帖由 [i]Susan﹏汪汪[/i] 於 2017-2-6 07:40 PM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=455946525&ptid=26426434][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]

放心

冇記錯汪汪部電腦的spec應該差過你果部好多 [/quote]我現時Optimize到Bottleneck是RAM Bandwidth, 用Dual-Channel DDR4已經可以快過我的電腦 (我的是Dual-Channel DDR3, Bandwidth約是18GB/s)

Susan﹏汪汪 2017-2-6 21:10

[quote]原帖由 [i]sswroom[/i] 於 2017-2-6 08:51 PM 發表 [url=http://www.discuss.com.hk/redirect.php?goto=findpost&pid=455949771&ptid=26426434][img]http://www.discuss.com.hk/images/common/back.gif[/img][/url]
我現時Optimize到Bottleneck是RAM Bandwidth, 用Dual-Channel DDR4已經可以快過我的電腦 (我的是Dual-Channel DDR3, Bandwidth約是18GB/s) [/quote]
汪汪部電腦8 GB 1600 MHz DDR3

Susan﹏汪汪 2017-2-7 12:39

搬左looping到@_specialize裡面
[url=https://github.com/SusanDoggie/Doggie/commit/095fe7ef86446d2983ea9b2b44802723063fc726]https://github.com/SusanDoggie/Doggie/commit/095fe7ef86446d2983ea9b2b44802723063fc726[/url]

時間提升到
nearest neighbor: 0.028126
linear: 0.116269
cosine: 0.137315
cubic: 0.349245
lanczos 3: 1.945959

Susan﹏汪汪 2017-2-7 17:51

mitchell 1/3 1/3

Susan﹏汪汪 2017-2-15 10:44

nearest neighbor由0.024秒再提升到0.010秒
整數除法影響力好大
[url=https://github.com/SusanDoggie/Doggie/commit/354398b93d5222be181dcad078d2a121e6d2d97a]https://github.com/SusanDoggie/Doggie/commit/354398b93d5222be181dcad078d2a121e6d2d97a[/url]

sswroom 2017-2-18 02:45

[quote]原帖由 [i]Susan﹏汪汪[/i] 於 2017-2-15 10:44 AM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=456423496&ptid=26426434][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]
nearest neighbor由0.024秒再提升到0.010秒
整數除法影響力好大
[url=https://github.com/SusanDoggie/Doggie/commit/354398b93d5222be181dcad078d2a121e6d2d97a]https://github.com/SusanDoggie/Doggie/commit/354398b93d5222be181dcad078d2a121e6d2d97a[/url] [/quote]請問你的時間是由甚麼解像度Resize至甚麼解像度呢?

我剛剛試寫一個Nearest Neighbour,
1920x1080x32bpp -> 3840x2160x32bpp, 平均大約用0.0085秒。 用乘數有Floating Point Rounding Error問題, 所以主要用加數來計算位置

煙民母親生賤種

*** 作者被禁止或刪除 內容自動屏蔽 ***

Susan﹏汪汪 2017-2-18 07:50

[quote]原帖由 [i]sswroom[/i] 於 2017-2-18 02:45 AM 發表 [url=http://www.discuss.com.hk/redirect.php?goto=findpost&pid=456584188&ptid=26426434][img]http://www.discuss.com.hk/images/common/back.gif[/img][/url]
請問你的時間是由甚麼解像度Resize至甚麼解像度呢?

我剛剛試寫一個Nearest Neighbour,
1920x1080x32bpp -> 3840x2160x32bpp, 平均大約用0.0085秒。 用乘數有Floating Point Rounding Error問題, 所以主要用加數來 ... [/quote]
一直都係前面張圖
太多野做、只係間唔中update 下

加數好提議

[[i] 本帖最後由 Susan﹏汪汪 於 2017-2-18 07:58 AM [url=http://www.discuss.com.hk/iphone][img=100,23]http://i.discuss.com.hk/d/images/r10/iphoneD.jpg [/img][/url] 編輯 [/i]]

Susan﹏汪汪 2017-2-18 07:51

[quote]原帖由 [i]煙民母親生賤種[/i] 於 2017-2-18 03:29 AM 發表 [url=http://www.discuss.com.hk/redirect.php?goto=findpost&pid=456585002&ptid=26426434][img]http://www.discuss.com.hk/images/common/back.gif[/img][/url]
用什麼 framework 寫? [/quote]
佢自己寫嘅算法

Susan﹏汪汪 2017-2-18 08:22

[quote]原帖由 [i]sswroom[/i] 於 2017-2-18 02:45 AM 發表 [url=http://www.discuss.com.hk/redirect.php?goto=findpost&pid=456584188&ptid=26426434][img]http://www.discuss.com.hk/images/common/back.gif[/img][/url]
請問你的時間是由甚麼解像度Resize至甚麼解像度呢?

我剛剛試寫一個Nearest Neighbour,
1920x1080x32bpp -> 3840x2160x32bpp, 平均大約用0.0085秒。 用乘數有Floating Point Rounding Error問題, 所以主要用加數來 ... [/quote]
[url=https://github.com/SusanDoggie/Doggie/blob/master/Tests/DoggieTests/ImageTest.swift]https://github.com/SusanDoggie/Doggie/blob/master/Tests/DoggieTests/ImageTest.swift[/url]

新的benchmark係呢個
張圖有少少差異、因為之前係用AI隨手畫
但都係兩個圓、一黃一紅

Susan﹏汪汪 2017-2-18 09:45

[quote]原帖由 [i]Susan﹏汪汪[/i] 於 2017-2-18 07:50 AM 發表 [url=http://www.discuss.com.hk/redirect.php?goto=findpost&pid=456587665&ptid=26426434][img]http://www.discuss.com.hk/images/common/back.gif[/img][/url]

一直都係前面張圖
太多野做、只係間唔中update 下

加數好提議 [/quote]
改左加法後benchmark 結果speed有32% improvement

大約0.007秒

[[i] 本帖最後由 Susan﹏汪汪 於 2017-2-18 09:46 AM [url=http://www.discuss.com.hk/iphone][img=100,23]http://i.discuss.com.hk/d/images/r10/iphoneD.jpg [/img][/url] 編輯 [/i]]

Susan﹏汪汪 2017-2-18 11:03

試左1920x1080 -> 3840x2160
大概係0.07秒
頁: [1] 2
查看完整版本: Lanczos Resampling