在matlab中如何在roi中嵌入水印

在matlab中如何在roi中嵌入水印,matlab,image-processing,computer-vision,signal-processing,Matlab,Image Processing,Computer Vision,Signal Processing,计算图像中的感兴趣区域。现在,如何将水印嵌入到roi中。我已经将用于将水印嵌入到lsb中的整个图像的代码。如何仅针对roi进行修改 clear all; file_name='pout.tif'; cover_object=imread(file_name); file_name='cameraman.tif'; message=imread(file_name); message=double(message); message=round(message./256); mess

计算图像中的感兴趣区域。现在,如何将水印嵌入到roi中。我已经将用于将水印嵌入到lsb中的整个图像的代码。如何仅针对roi进行修改

clear all; 
file_name='pout.tif'; 
cover_object=imread(file_name); 
file_name='cameraman.tif'; 
message=imread(file_name); 
message=double(message); 
message=round(message./256); 
message=uint8(message); 
Mc=size(cover_object,1);    
Nc=size(cover_object,2);    
Mm=size(message,1);         
Nm=size(message,2);         

for ii = 1:Mc 
    for jj = 1:Nc 
        watermark(ii,jj)=message(mod(ii,Mm)+1,mod(jj,Nm)+1); 
    end 
end 

watermarked_image=cover_object; 
for ii = 1:Mc 
    for jj = 1:Nc 
        watermarked_image(ii,jj)=bitset(watermarked_image(ii,jj),1,watermark(ii,jj)); 
    end 
end 

imwrite(watermarked_image,'watermarkedimage','bmp'); 
figure(1) 
imshow(watermarked_image,[]) 
title('Watermarked Image')

如果您的roi是矩形的,只需在图像的适当部分循环,而不是整个图像

如果不是,则可以将水印定义为某些函数:

imgout=水印(img1、img2)

然后,您可以使用
roifilt2
在您的roi中应用该功能

在这个简单的例子中,
mask
是一个BW矩阵,其中1表示我们roi的一部分(可以通过多种不同的方式创建一个mask,包括使用一些交互式roi功能,请参见底部部分)<代码>img1
img2
已加载:

f = @(x) watermark(x,img2); % our very basic function 
imgout = roifilt2(img1,mask,f);
如果您的
img2
小于
img1
(或者您希望调整其大小以仅覆盖roi区域),则可能会出现并发症。在这种情况下,在img1/mask的一个子部分上执行所有操作,然后组装最终图像:

img1_s = img1(a:b,c:d); % these return the same size as img2
mask_s = mask(a:b,c:d); 

imgout_s = roifilt2(img1_s,mask1_s,f); 

imgout = img1;
imgout(a:b,c:d) = imgout_s;

可以通过多种方式创建遮罩,有些使用交互式roi功能,有些不使用。这在很大程度上取决于您首先如何获得roi-您是否有一个中心/半径,或者您是否希望以交互方式手动拾取位置,等等。下面是一些使用图像处理工具箱的示例:

交互式ROI功能和createMask。

这将适用于任何交互式roi功能(imellipse、imfreehand等)。可以在第二步和第三步之间以交互方式调整遮罩。在调用
createMask
之前,不要关闭图像窗口

h = imshow(img); %display image
e = imellipse(gca,[50 50 100 100]); % select roi
mask = createMask(e,h); % return mask
x/y点和poly2mask列表 如果您有一个定义roi外边缘的点列表,那么生成遮罩的快速非交互式方法是使用poly2mask。第三个和第四个值定义返回的掩码的总大小

mask = poly2mask(x,y,size(img,1),size(img,2));
使用形态运算符
strel
定义一个结构元素,而
imdiplate
使用该结构元素执行一个扩展。给定一个包含单个点的图像,所做的是用结构元素替换该点-在本例中,
磁盘
,它将生成一个圆(或使用像素尽可能接近)。其他形状(例如,
diamond
)可与
strel

mask = zeros(size(img));
mask(a,b) = 1; % a,b is the centre point of the circle
se = strel(disk,r,0); %r is the radius of the circle
mask = imdilate(mask,se);

你能解释一下你想做什么吗?在图像上添加水印的方法有很多种。我有两张图像img1和img2。现在我需要将img 2嵌入到img 1的roi中,你所说的“嵌入”是什么意思?将一幅图像嵌入另一幅图像。用一幅图像的像素值修改另一幅图像的像素值。一个典型的数据隐藏我知道,但是有很多方法可以将一个图像隐藏在另一个图像中;您只需要将“掩码”定义为二进制图像。我将添加一些示例。