简单的不可见水印如下:
#include <cv.h>
#include <highgui.h>
void kcvWatermarking ( IplImage *img, IplImage *mask ) {
int w = img->width;
int h = img->height;
/* 确保mask中只有黑白两种灰度值 */
cvThreshold ( mask, mask, 128, 255, CV_THRESH_BINARY );
for ( int i = 0; i < h; ++i ) {
for ( int j = 0; j < w; ++j ) {
if ( CV_IMAGE_ELEM ( mask, uchar, i, j ) ) {
CV_IMAGE_ELEM ( img, uchar, i, j ) |= 0x1;
} else {
CV_IMAGE_ELEM ( img, uchar, i, j ) &= 0xfe;
}
}
}
}
void kcvGetWatermarking ( IplImage *img, IplImage *dst ) {
int w = img->width;
int h = img->height;
for ( int i = 0; i < h; ++i ) {
for ( int j = 0; j < w; ++j ) {
if ( CV_IMAGE_ELEM ( img, uchar, i, j ) & 0x1 ) {
CV_IMAGE_ELEM ( dst, uchar, i, j ) = 0;
} else {
CV_IMAGE_ELEM ( dst, uchar, i, j ) = 255;
}
}
}
}
int main ( int argc, char **argv ) {
IplImage *img = cvLoadImage ( "timg1.jpg", 0 );
IplImage *mask = cvCreateImage ( cvGetSize ( img ), 8, 1 );
IplImage *dst = cvCreateImage ( cvGetSize ( img ), 8, 1 );
cvSetZero ( mask );
CvFont font = cvFont ( 2 );
char text[] = "minmin, i love you!";
cvPutText ( mask, text, cvPoint ( 50, 50 ), &font, CV_RGB ( 255, 255, 255 ) );
cvNamedWindow ( "img" );
cvNamedWindow ( "min" );
cvShowImage ( "img", img );
cvShowImage ( "min", mask );
/* 执行水印 */
kcvWatermarking ( img, mask );
cvNamedWindow ( "comp" );
cvShowImage ( "comp", img );
/* 获得水印 */
kcvGetWatermarking ( img, dst );
cvNamedWindow ( "watermarking" );
cvShowImage ( "watermarking", dst );
cvWaitKey ( 0 );
cvDestroyAllWindows();
cvReleaseImage ( &img );
cvReleaseImage ( &mask );
cvReleaseImage ( &dst );
return 0;
}
补充说明:在添加图片水印时,如果两个图片的尺寸接近,有可能会运行错误。