Как сделать водяной знак в частотной области?

Я новичок в Matlab, и у меня есть задание, которое требует нанесения водяных знаков на изображение с использованием преобразования DCT:

  • Прочитайте цветное изображение Lin.jpg и примените DCT.
  • Превратите logo.jpg (водяной знак) в двоичный код и увеличьте его силу в десять раз, а затем добавьте его к коэффициенту преобразованного изображения Lin.

Вот два изображения:

введите здесь описание изображения введите здесь описание изображения

У меня три вопроса:

  1. Я должен разделить Lin.jpg на блоки 8x8 и logo.jpg на блоки 2x2 или в этом нет необходимости?
  2. что это означает: в десять раз больше его силы? Это просто умножить на 10?
  3. Как я могу получить коэффициент преобразованного изображения Lin.jpg?

Вот что я пробовал:

img = imread('Lin.jpg');
wImg = imread('njit_logo.jpg');

wImgBinary = imbinarize(wImg) * 10;
[rows, cols] = size(img(:,:,1));
[Wrows, Wcols] = size(wImgBinary);

% make the watermark image as large as the original
watermark = zeros(size(img), 'uint8');
for column = 1:cols
    for row = 1:rows
        watermark(row, column) = wImgBinary(mod(row,Wrows)+1, mod(column,Wcols)+1);
    end
end
watermark = watermark(1:rows, 1:cols);

% apply dct and add with watermark at each channel
for i = 1:3
    imgDct = dct2(img(:,:,i));
    C = imgDct + double(watermark);
    Iw(:,:,i) = round(real(idct2(C)));
end

IIw = uint8(Iw);
figure, imshow(IIw), title('watermarked image');

person Hadi GhahremanNezhad    schedule 11.11.2020    source источник
comment
Хм, обычно я делаю блокировку для сжатия, но я думаю, что если вы хотите поместить водяной знак в шаблон плитки, это может помочь. Я думаю, что коэффициенты относятся к результату дискретного косинусного преобразования dct2(), примененного к изображению, которое является их частотными коэффициентами. В 10 раз больше силы не знаю, умножение на 10 звучит правильно.   -  person MichaelTr7    schedule 12.11.2020


Ответы (1)


Изображение водяного знака путем объединения компонентов дискретного косинусного преобразования

В этом случае я обнаружил, что использование Watermark_Strength (коэффициента силы) 30 в этом примере дает более заметные результаты. Конвейер для добавления водяного знака выглядит следующим образом:

• Обнулите изображение водяного знака, чтобы оно соответствовало размеру изображения, на которое будет нанесен водяной знак, с помощью функции padarray() или, альтернативно, увеличьте изображение.
• Разделите изображение и изображение водяного знака на их каналы/компоненты RGB.
• Выполните дискретное косинусное преобразование (DCT) всех цветовых каналов, используя функцию dct2().
• Умножьте компоненты дискретного косинусного преобразования (DCT) изображения с водяным знаком на коэффициент силы.
• Добавьте соответствующие компоненты дискретного косинусного преобразования (DCT) на основе цветового канала.
• Инверсия 3 результирующих компонентов дискретного косинусного преобразования (DCT) с использованием функции idct2().
• Объедините инвертированные компоненты для создания изображения с водяным знаком в пространственной области.

Изображение с водяным знаком

Image = imread('Lin.jpg');
Watermark = imread('njit_logo.jpg');

%Grabbing the image and watermark dimensions%
[Image_Height,Image_Width,~] = size(Image);
[Watermark_Height,Watermark_Width,~] = size(Watermark);

%Padding the watermark to match the size of the image to be watermarked%
Side_Padding = (Image_Width - Watermark_Width)/2;
Top_And_Bottom_Padding = (Image_Height - Watermark_Height)/2;
Watermark_Padded = padarray(Watermark,[Top_And_Bottom_Padding Side_Padding],0,'both');

%Binary image of watermark%
Watermark_Binary = imbinarize(Watermark_Padded);

%Converting the watermark image to frequency domain using DCT%
Watermark_Strength = 30;
Red_Channel_Watermark_DCT = Watermark_Strength*dct2(Watermark_Binary(:,:,1));
Blue_Channel_Watermark_DCT = Watermark_Strength*dct2(Watermark_Binary(:,:,2));
Green_Channel_Watermark_DCT = Watermark_Strength*dct2(Watermark_Binary(:,:,3));

%Converting the image to frequency domain using DCT%
Red_Channel_Image_DCT = dct2(Image(:,:,1));
Blue_Channel_Image_DCT = dct2(Image(:,:,2));
Green_Channel_Image_DCT = dct2(Image(:,:,3));

%Adding the frequency components together%
Combined_Red_Channel = Red_Channel_Watermark_DCT + Red_Channel_Image_DCT;
Combined_Blue_Channel = Blue_Channel_Watermark_DCT + Blue_Channel_Image_DCT;
Combined_Green_Channel = Green_Channel_Watermark_DCT + Green_Channel_Image_DCT;

%Inversing the combined frequency domain image%
Combined_Image(:,:,1) = idct2(real(Combined_Red_Channel));
Combined_Image(:,:,2) = idct2(real(Combined_Blue_Channel));
Combined_Image(:,:,3) = idct2(real(Combined_Green_Channel));

%Displaying combined image%
Combined_Image = uint8(Combined_Image);
imshow(Combined_Image);

Выполнено с использованием MATLAB R2019b

person MichaelTr7    schedule 11.11.2020
comment
Спасибо, это здорово. Я понял, что не применил DCT к изображению водяного знака. Я применил его только к основному изображению. - person Hadi GhahremanNezhad; 12.11.2020
comment
Нет, проблема, счастливы, что поймали недостающий шаг! :) - person MichaelTr7; 12.11.2020