Информация об изменениях

Сообщение Re: Ordered dithering от 26.04.2024 21:04

Изменено 26.04.2024 21:20 kov_serg

Re: Ordered dithering
Здравствуйте, Aniskin, Вы писали:

A>Пытаюсь научиться переводить полноцветные изображения в изображения RGB333, в которых на каждый канал отводится по три бита, с использованием ordered dithering.

Если сделать тупо в лоб без коррекции. То результат от вашего RGB333 заметно отличается, причем как для матриц 2x2, 4x4 так и 8x8.


Верхний ряд преобразованное изображение (8x8), нижний оригинал.


  code
if not love then os.execute "love ." os.exit() end -- https://love2d.org
local app,g={ P=3, CL=8 }, love.graphics
app.pixel_shader=string.format([[
#define CL %d
#define W  %d
uniform float noise[W*W];
vec4 effect(vec4 c,Image tex,vec2 uv,vec2 xy){
    vec4 p=Texel(tex,uv);
    int idx=int(mod(floor(xy.x),W)+W*mod(floor(xy.y),W));
    float e=noise[idx]/CL;
    vec4 q=p*c+vec4(e,e,e,0);
    q=floor(q*CL)/(CL-1);
    return q;
}
]],app.CL,2^app.P)

function love.load()
    app.shader=g.newShader(app.pixel_shader)
    app.shader:send("noise",unpack(gen_noise_table(app.P)))
    app.image=g.newImage "OrderedSample.png"
    -- app.image=g.newImage "LinRGB2.png"
end
function love.draw()
    g.setShader(app.shader) g.draw(app.image,8,8) g.setShader()
    g.draw(app.image,8,208)
end
function love.keypressed(key)
    if key=='escape' then love.event.quit() end
end

function gen_noise_table(p) -- https://en.wikipedia.org/wiki/Ordered_dithering
    local function f(x,y,n) local r=0
        for i=1,n do r=r+r+x%2 x=bit.rshift(x,1) r=r+r+y%2 y=bit.rshift(y,1) end
        return r
    end
    local r,n,k = {}, 2^p, 2/(4^p-1)
    for y=0,n-1 do for x=0,n-1 do table.insert(r,f(bit.bxor(x,y),y,p)*k-1) end end
    return r
end
Re: Ordered dithering
Здравствуйте, Aniskin, Вы писали:

A>Пытаюсь научиться переводить полноцветные изображения в изображения RGB333, в которых на каждый канал отводится по три бита, с использованием ordered dithering.

Если сделать тупо в лоб без коррекции. То результат от вашего RGB333 заметно отличается, причем как для матриц 2x2, 4x4 так и 8x8.


Верхний ряд преобразованное изображение (8x8), нижний оригинал.


  main.lua
if not love then os.execute "love ." os.exit() end -- https://love2d.org
local app,g={ P=3, CL=8 }, love.graphics
app.pixel_shader=string.format([[
#define CL %d
#define W  %d
uniform float noise[W*W];
vec4 effect(vec4 c,Image tex,vec2 uv,vec2 xy){
    vec4 p=Texel(tex,uv);
    int idx=int(mod(floor(xy.x),W)+W*mod(floor(xy.y),W));
    float e=noise[idx]/CL;
    vec4 q=p*c+vec4(e,e,e,0);
    q=floor(q*CL)/(CL-1);
    return q;
}
]],app.CL,2^app.P)

function love.load()
    app.shader=g.newShader(app.pixel_shader)
    app.shader:send("noise",unpack(gen_noise_table(app.P)))
    app.image=g.newImage "OrderedSample.png"
    -- app.image=g.newImage "LinRGB2.png"
end
function love.draw()
    g.setShader(app.shader) g.draw(app.image,8,8) g.setShader()
    g.draw(app.image,8,208)
end
function love.keypressed(key)
    if key=='escape' then love.event.quit() end
end

function gen_noise_table(p) -- https://en.wikipedia.org/wiki/Ordered_dithering
    local function f(x,y,n) local r=0
        for i=1,n do r=r+r+x%2 x=bit.rshift(x,1) r=r+r+y%2 y=bit.rshift(y,1) end
        return r
    end
    local r,n,k = {}, 2^p, 2/(4^p-1)
    for y=0,n-1 do for x=0,n-1 do table.insert(r,f(bit.bxor(x,y),y,p)*k-1) end end
    return r
end