0

计算图像中的感兴趣区域。现在如何将水印嵌入到 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')
4

1 回答 1

0

如果您的 roi 是矩形的,只需遍历图像的适当子部分而不是整个图像。

如果没有,您可以将水印定义为某个函数:

imgout = watermark(img1, img2);

然后你可以使用roifilt2在你的投资回报率中应用这个功能。

在这个简单的例子中,mask是一个 BW 矩阵,其中 1 表示我们的 roi 的一部分(可以通过几种不同的方式创建掩码,包括使用一些交互式 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定义一个结构元素,并imdilate使用该结构元素执行膨胀。给定一个包含单个点的图像,它所做的就是用结构元素替换该点 - 在这种情况下disk,它将产生一个圆(或使用像素尽可能接近)。其他形状(例如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);
于 2013-11-06T16:59:12.123 回答