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

Сообщение Re[3]: Квантование изображения от 21.01.2021 18:22

Изменено 21.01.2021 18:23 kov_serg

Re[3]: Квантование изображения
Здравствуйте, Aniskin, Вы писали:

A>Здравствуйте, Chorkov, Вы писали:


C>>В процедуре расчетов центров масс кластеров, рассчитывал центры масс только для основных цветов.

C>>Если точка принадлежит кластеру цвета AB, то учитывал ее (с весом 1/2) в кластерах A и B.

A>Спасибо за идею. Но не могу сообразить, как ее применить на практике. Предположим, в какой-то момент образовались следующие кластеры:


A>A — состоит из одного цвета со значением 4, центр кластера 4.

A>AB — состоит из трех цветов со значениями 6, 7 и 8, центр кластера (6 + 7 + 8) / 3 = 7.
A>B — состоит из двух цветов со значениями 11 и 13, центр кластера (11 + 13) / 2 = 12.

A>Как посчитать правильные центры кластеров A и B для указанных значений?

Можно ввести функцию ошибки и её минимизировать. Например так:
S(a,b)=(a-4)^2 + ((a+b)/2-6)^2 + ((a+b)/2-7)^2 + ((a+b)/2-8)^2 + (b-11)^2 + (b-13)^2
dS/da = 0
dS/db = 0
Получаешь простую линейную систему уравнений.
В твоём варианте примерно так A=3.3 B=11.6:

#!/usr/bin/lua

function AB(x)
    local n,s,a11,a22,a12,d,y
    local function sum(a) local s=0 for i=1,#a do s=s+a[i] end return s end
    n={} s={} for i=1,3 do n[i]=#(x[i]) s[i]=sum(x[i]) end
    a11=n[1]+n[2]/4
    a22=n[3]+n[2]/4
    a12=n[2]/4
    d=a11*a22-a12*a12
    y={ s[1]+s[2]/2, s[3]+s[2]/2 }
    return (y[1]*a22-y[2]*a12)/d, (y[2]*a11-y[1]*a12)/d 
end

print( AB{ {4}, {6,7,8}, {11,13} } )

3.2941176470588    11.647058823529
Re[3]: Квантование изображения
Здравствуйте, Aniskin, Вы писали:

A>Здравствуйте, Chorkov, Вы писали:


C>>В процедуре расчетов центров масс кластеров, рассчитывал центры масс только для основных цветов.

C>>Если точка принадлежит кластеру цвета AB, то учитывал ее (с весом 1/2) в кластерах A и B.

A>Спасибо за идею. Но не могу сообразить, как ее применить на практике. Предположим, в какой-то момент образовались следующие кластеры:


A>A — состоит из одного цвета со значением 4, центр кластера 4.

A>AB — состоит из трех цветов со значениями 6, 7 и 8, центр кластера (6 + 7 + 8) / 3 = 7.
A>B — состоит из двух цветов со значениями 11 и 13, центр кластера (11 + 13) / 2 = 12.

A>Как посчитать правильные центры кластеров A и B для указанных значений?

Можно ввести функцию ошибки и её минимизировать. Например так:
S(a,b)=(a-4)^2 + ((a+b)/2-6)^2 + ((a+b)/2-7)^2 + ((a+b)/2-8)^2 + (b-11)^2 + (b-13)^2
dS/da = 0
dS/db = 0
Получаешь простую линейную систему уравнений.
В твоём варианте примерно так A=3.3 B=11.6:

#!/usr/bin/lua

function AB(x)
    local function sum(a) local s=0 for i=1,#a do s=s+a[i] end return s end
    local n,s,a11,a22,a12,d,y
    n={} s={} for i=1,3 do n[i]=#x[i] s[i]=sum(x[i]) end
    a11=n[1]+n[2]/4
    a22=n[3]+n[2]/4
    a12=n[2]/4
    d=a11*a22-a12*a12
    y={ s[1]+s[2]/2, s[3]+s[2]/2 }
    return (y[1]*a22-y[2]*a12)/d, (y[2]*a11-y[1]*a12)/d 
end

print( AB{ {4}, {6,7,8}, {11,13} } )

3.2941176470588    11.647058823529