Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
more.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
955.17 Кб
Скачать

Matlab-реализация алгоритма

Matlab-функция, выполняющая разделения исходного двоичного изображения на два теневых «в лоб», использующая 4 (из 6 возможных, см. рис. 6) состояния пикселя будет иметь следующий вид:

function [S1,S2] =getShdwImg(Img)

% получение теневых изображений S1 и S2 из исходного бинарного изображения (Img)

%

% получаем размер исходного изображения

[m,n] = size(Img);

% запасаемся памятью для каждого теневого изображения :)

S1= zeros(2*m,2*n);

S2= zeros(2*m,2*n);

% для каждого пикселя исходного изображения - действуем согласно Рис. 1

% Примечание:

for i=1:m-1

for j=1:n-1

r = randi(4);

if(Img(i,j)==1)

switch r

case 1,

S1(2*i,2*j)=1;

S1(2*i+1,2*j)=1;

S1(2*i,2*j+1)=0;

S1(2*i+1,2*j+1)=0;

S2(2*i,2*j)=1;

S2(2*i+1,2*j)=1;

S2(2*i,2*j+1)=0;

S2(2*i+1,2*j+1)=0;

case 2,

S1(2*i,2*j)=0;

S1(2*i+1,2*j)=0;

S1(2*i,2*j+1)=1;

S1(2*i+1,2*j+1)=1;

S2(2*i,2*j)=0;

S2(2*i+1,2*j)=0;

S2(2*i,2*j+1)=1;

S2(2*i+1,2*j+1)=1;

case 3,

S1(2*i,2*j)=0;

S1(2*i+1,2*j)=1;

S1(2*i,2*j+1)=1;

S1(2*i+1,2*j+1)=0;

S2(2*i,2*j)=0;

S2(2*i+1,2*j)=1;

S2(2*i,2*j+1)=1;

S2(2*i+1,2*j+1)=0;

case 4,

S1(2*i,2*j)=1;

S1(2*i+1,2*j)=0;

S1(2*i,2*j+1)=0;

S1(2*i+1,2*j+1)=1;

S2(2*i,2*j)=1;

S2(2*i+1,2*j)=0;

S2(2*i,2*j+1)=0;

S2(2*i+1,2*j+1)=1;

end

else

switch r

case 1,

S1(2*i,2*j)=1;

S1(2*i+1,2*j)=1;

S1(2*i,2*j+1)=0;

S1(2*i+1,2*j+1)=0;

S2(2*i,2*j)=0;

S2(2*i+1,2*j)=0;

S2(2*i,2*j+1)=1;

S2(2*i+1,2*j+1)=1;

case 2,

S1(2*i,2*j)=0;

S1(2*i+1,2*j)=0;

S1(2*i,2*j+1)=1;

S1(2*i+1,2*j+1)=1;

S2(2*i,2*j)=1;

S2(2*i+1,2*j)=1;

S2(2*i,2*j+1)=0;

S2(2*i+1,2*j+1)=0;

case 3,

S1(2*i,2*j)=0;

S1(2*i+1,2*j)=1;

S1(2*i,2*j+1)=1;

S1(2*i+1,2*j+1)=0;

S2(2*i,2*j)=1;

S2(2*i+1,2*j)=0;

S2(2*i,2*j+1)=0;

S2(2*i+1,2*j+1)=1;

case 4,

S1(2*i,2*j)=1;

S1(2*i+1,2*j)=0;

S1(2*i,2*j+1)=0;

S1(2*i+1,2*j+1)=1;

S2(2*i,2*j)=0;

S2(2*i+1,2*j)=1;

S2(2*i,2*j+1)=1;

S2(2*i+1,2*j+1)=0;

end

end

end

end

Функция getShdwImg разбивает исходное изображение так, как показано на Рис. 1, с единственной разницей только в том, что в двоичных изображениях Matlab — черные пиксели изображения равну нулю, а белые, соответственно, равны единице. Ниже приведен код Matlab-скрипта, демонстрирующий работу алгоритма разделения секретной визуальной информации.

close all

% считываем исходное RGB-изображение и преобразуем его в бинарное

biImg = imread('nordavind_logo.jpg');

biImg = rgb2gray(biImg);

level = graythresh(biImg); % пороговая фильтрация по Отсу (Otsu)

biImg = im2bw(biImg,level);

% выводим результат на экран

figure(1)

imshow(biImg);

title(['Original binary image']);

% получаем два теневых изображения

[S1,S2] =getShdwImg(biImg);

% выводим их на экран

figure(2)

imshow(S1);

title(['Shadow image S1']);

%

figure(3)

imshow(S2);

title(['Shadow image S2']);

% выводим на экран результат их наложения друг на друга

% различными способами

figure(4)

% imshow(or(S1, S2));

% imshow(and(S1,S2));

imshow(~xor(S1, S2)); % операция “~”(NOT) используется, чтобы получить черный текст на белом фоне, а не наоборот

title(['Superimposed image']);

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]