Matlab从图像中选择区域来改变

时间:2014-12-11 19:43:21

标签: image matlab image-processing watermark steganography

所以我正在实现

中的可逆水印技术
  

"可逆可见水印和原始无损恢复   图像"作者:Y。Hu和B. Jeon。

因此,嵌入过程的一部分涉及将水印插入图像区域的位平面(MSB / 7thSB)。该区域的左上角起始角和区域大小将是已知的。

我想我在这里有一个脑死亡的时刻,但我想知道是否有人知道如何从图像中选择这个区域以便我可以操纵它?

目前我有region_R = image_I(regionStartPoint + size_W);,但我很确定这不对。在我获得该区域并对其进行操作之后,我还必须将其放回到图像中,我是否通过类似outputImage = union(region_R, surroundingSpace)的方式执行此操作,其中surroundingspace是没有区域的图像?

也许我在这里得到了错误的结局!也许我只需要在我的操作过程中使用for循环来从起点开始?或者使用imcrop,但我认为这听起来不太合适。

谢谢!

1 个答案:

答案 0 :(得分:4)

你非常接近。假设regionStartPoint存储了您要启动的左上角的,并且它是一个双元素数组,并假设{ {1}}包含所需区域的高度宽度,也可以作为双元素数组,只需执行以下操作:

size_W

在上面的代码中,我们想要访问一系列行元素,从左上角开始(region_R = image_I(regionStartPoint(1):regionStartPoint(1)+size_W(1)-1,... regionStartPoint(2):regionStartPoint(2)+size_W(2)-1,:); ),我们想要访问regionStartPoint(1)元素的元素,您最多可以访问size_W(1) = height。减去1的原因是因为当我们索引到特定维度时,我们正在访问范围内的每个元素(包括)。例如,如果我们的起始行位置为1,并且我们的高度为2,那么我们只能访问第1行和第2行。如果我们从1开始并按regionStartPoint(1)+size_W(1)-1元素上升,我们实际上会抓住一个额外的元素,所以我们得到第1,2行 3.我们不想要最后一行,因此减1可以帮助我们做到这一点。以类似的方式,如果我们希望访问一系列列元素,它也从左上角开始(height=2),并且我们想要访问regionStartPoint(2)元素的元素,最多可访问size_W(2) = width个元素。

因此,我们访问矩阵,使第一个参数指定所需的行范围,第二个参数指定所需的列范围。因为您的图像可能是彩色或灰度,所以我使用regionStartPoint(2)+size_W(2)-1作为最后一个参数,以便您可以获得所有3D切片。如果您的图像是灰度图像,那么这不会做任何事情,但如果它的颜色,它将为您提供一个3D矩阵,其中每个切片的大小与您想要提取的区域相同,并且将为许多切片,因为有颜色平面。

完成图像操作后,您可以将其重新放回:

image_I
image_I(regionStartPoint(1):regionStartPoint(1)+size_W(1)-1,... regionStartPoint(2):regionStartPoint(2)+size_W(2)-1,:) = region_R_final; 中提取后,

region_R_final将成为被操纵的图像。这是完全与您之前想要提取图像的一部分时所看到的相同类型的语法,但现在角色是相反的。我们希望将此部分返回放入图像中,因此您只需交换作业(image_I)运算符左侧和右侧的内容。< / p>


或者,如果您无法计算出数学偏移并提取出图像中的内容,则可以使用图像处理工具箱中的imcrop。具体来说,你会这样做:

=

第一个输入是您想要裁剪的图像,而第二个元素是一个包含以下格式的4个元素的数组:

region_r = imcrop(image_I, [regionStartPoint(2) regionStartPoint(1) size_W(2) size_W(1)]);

[x y w h] x是您要提取的左上角的位置,而y 1}}和w是要提取的部分的宽度和高度。如果您将其翻转,以便h首先包含,接着是regionStartPoint使其具有宽度< / strong>首先是高度,此代码将简化为:

sizeW

在运行region_r = imcrop(image_I, [regionStartPoint size_W]); 之前,请确保您的[x y w h]数组的顺序正确。


次要注意事项

我不确定你如何提取图片中每个像素的MSB,但请考虑使用bitget。这将采用矩阵或向量,并指定要获取的位位置。这将返回一个0s / 1s数组,其大小与您提供的输入相同,每个位置将为您提供矩阵中每个数字的相应位。在你的情况下,你会这样做:

imcrop

bitMSB = bitget(A, 8); 将是您想要分析的图像,A是您想要获得的第8个位置/位。实际上我们在MATLAB中从1而不是0开始计数(即1索引)。


祝你好运!