Применение симплекс-метода
作者
using Statistics
include("$(pwd())/contrastBC.jl")
include("$(pwd())/rangfilt.jl")
function simplex(Xin, J, I)
# Xin – анализируемые факторы (матрица k x n)
# J – интервал варьирования факторов (вектор длины k)
# I – изображение (матрица)
# Возвращает:
# Xr – матрица, хранящая значения каждого шага
# I1 – изображение после обработки
# MeanImg – результирующее изображение
k = size(Xin, 1) # Количество факторов
p = (k - 1 + sqrt(k + 1)) / (k * sqrt(2))
q = (sqrt(k + 1) - 1) / (k * sqrt(2))
# Подготовка матрицы
X = fill(q, k, k)
for i in 1:k
X[i, i] = p
end
X = vcat(zeros(1, k), X)
X = repeat(Xin', k + 1, 1) + X .* repeat(J', k + 1, 1)
# Эксперимент
S = zeros(k + 1)
I1 = similar(I)
MeanImg = similar(I)
for i in 1:k+1
T = round.(Int, X[i, :])
I1 = rangfilt(I, T)
S[i], _ = contrastBC(I1)
end
Xr = hcat(X, S)
rp = 4 # Счетчик (номер текущей новой вершины)
while rp < 50
sn = argmin(S) # Номер строки с наихудшим откликом
# Проверка на упорядоченность
for p in 1:k+1
if sort(X[p, :]) != X[p, :]
sn = p
break
end
end
# Обновление вершины
X[sn, :] = (2 / k) * sum(X, dims=1) .- (2 / k + 1) * X[sn, :]
T = round.(Int, X[sn, :])
I1 = rangfilt(I, T)
S[sn], MeanImg = contrastBC(I1)
Xr = vcat(Xr, hcat(X[sn, :], S[sn])) # Добавляем новую строку в Xr
rp += 1
end
return Xr, I1, MeanImg
end
## Пример использования
# Xin = rand(3, 3) # Пример анализируемых факторов
# J = rand(3) # Пример интервала варьирования факторов
# I = rand(100, 100) # Пример изображения
## Применение функции
# Xr, I1, MeanImg = simplex(Xin, J, I)
## Сохранение результата (если нужно)
# save("I1.png", Gray.(I1))
# save("MeanImg.png", Gray.(MeanImg))