использование DCT для встраивания водяного знака

Я записал код openCV. Я попытался встроить изображение водяного знака 64X64 пикселей в изображение 512X512. мой код состоит из 5 частей:

  1. чтение двух изображений (водяной знак и исходное изображение, которое я хочу вставить в него водяным знаком)
  2. изменить размер 2 прочитанных изображений до указанного размера (64x64 для изображения водяного знака и 512x512 для исходного изображения)
  3. разделить исходное изображение с измененным размером на блоки 8X8 и преобразовать их с помощью DCT.
  4. встраивание каждого пикселя водяного знака в каждый блок исходного изображения.
  5. применение обратного DCT к каждому блоку.

У меня такая проблема, что все три imshow имеют одинаковые результаты. Спасибо за помощь :)

вот мой код:

int _tmain(int argc, _TCHAR* argv[])
{

int index=0;
int iindex=0;
vector<Mat> blocks(4096);


/////////////Part1:reading images


Mat originalImage;     
originalImage = imread("C:\\MGC.jpg",CV_LOAD_IMAGE_GRAYSCALE);   
Mat watermarkImage;  
watermarkImage = imread("C:\\ivp_lg.bmp" , CV_LOAD_IMAGE_GRAYSCALE);

/// show original image
namedWindow("Original");
int x = 0; int y = 0;
moveWindow("Original", x, y);
imshow("Original", originalImage);
x += 100; y += 100;


//////Part 2:Leave originals alone, work on a copys. resize readed images 


Mat dctImage = originalImage.clone();
Mat wmrk = watermarkImage.clone();
Mat tmp1(512, 512, CV_8UC1);
Mat tmp2(64, 64, CV_8UC1);
resize(dctImage, dctImage, tmp1.size());
resize(wmrk, wmrk , tmp2.size());


/////Part 3:break dctImage into 8X8 blocks and applying DCT on each block


for (int i = 0; i < 512; i += 8)
{
    for (int j = 0; j < 512; j+= 8)
    {
        Mat block = dctImage(Rect(i, j, 8, 8)); 
        block.convertTo(block,  CV_32FC1); 
        dct(block,blocks[index]);
        blocks[index].convertTo(blocks[index], CV_8UC1);
        index++;

    }
}

/// show transformed image
namedWindow("TransformedImage");
moveWindow("TransformedImage", x, y);
imshow("TransformedImage",dctImage );
x += 100; y += 100;


//////Part 4: embeding watermark. if corresponding pixel of watermark was 255 then element (5,5) in the block increase 200 otherwise do nothing


for(int idx=0 ; idx<4096 ; idx++)
{
    int i=idx/64;
    int j=idx%64;
    float elem=(float) wmrk.at<uchar>(i,j);
    if (elem>=128)
        {

            float tmp=(float) blocks[idx].at<uchar>(5,5);
            float temp=tmp +200;
            uchar ch=(uchar) temp;
            blocks[idx].at<uchar>(5,5)=ch;
        }
}


//////Part 5:applying iDCT on each block    


for (int i = 0; i < 512; i += 8)
{
    for (int j = 0; j < 512; j+= 8)
    {
        Mat block = dctImage(Rect(i, j, 8, 8)); 
        block.convertTo(block,  CV_32FC1); 
        idct(block,blocks[iindex]);
        blocks[iindex].convertTo(blocks[iindex], CV_8UC1);
        iindex++;

    }
}

/// show watermarked image
namedWindow("WatermarkedImage");
moveWindow("WatermarkedImage", x, y);
imshow("WatermarkedImage",dctImage );



cvWaitKey(80000);

destroyAllWindows();

return 0;

}

person N_Kh    schedule 19.05.2015    source источник
comment
Если вы можете работать с цифровыми водяными знаками, используя другой метод DCT, я могу помочь вам через MATLAB использовать надежный метод водяных знаков, основанный на модуляции индекса квантования (QIM). Можете поискать, если интересно..   -  person Christina    schedule 20.05.2015
comment
@Christina: спасибо за ваше предложение. Меня интересуют цифровые водяные знаки, но меня также очень интересует программирование на C ++, и именно поэтому я хочу реализовать водяные знаки с помощью библиотеки openCV программирования на C ++.   -  person N_Kh    schedule 20.05.2015


Ответы (1)


@N_Kh Насколько я видел ваш код в спешке, вы выполняете команду IMSHOW над матрицей dctImage, выполняя операции с разными матрицами и векторными блоками и блоками соответственно.

person Manan Maqbool    schedule 07.04.2016
comment
Это не дает ответа на вопрос. Получив достаточную репутацию, вы сможете /comment">прокомментировать любой пост; вместо этого дайте ответы которые не требуют пояснений от спрашивающего. – Из обзора - person Maroun; 07.04.2016
comment
@MarounMaroun Я думаю, что это ответ на его вопрос, почему он получает то же изображение после выполнения команды IMSHOW. Он не просил никакого кода, я верю..!! - person Manan Maqbool; 07.04.2016