【问题标题】:Matlab select region from an image to alterMatlab从图像中选择区域来改变
【发布时间】:2015-02-10 10:10:43
【问题描述】:

所以我正在实施

中的可逆水印技术

“可逆可见水印和原件无损恢复 图片由 Y. Hu 和 B. Jeon 拍摄。

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

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

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

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

谢谢!

【问题讨论】:

  • 这和处理语言有关系吗?如果不是,则不应包含处理标签。
  • 哎呀!意在写图像处理

标签: image matlab image-processing watermark steganography


【解决方案1】:

你很亲密。假设regionStartPoint存储了你想要开始的左上角的rowcolumn,它是一个二元素数组,并假设size_W包含你想要的区域的heightwidth,也可以作为一个二元数组,只需这样做:

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 元素,您最多可以访问regionStartPoint(1)+size_W(1)-1。您减去 1 的原因是因为当我们索引到特定维度时,我们正在访问范围内(包括)内的每个元素。例如,如果我们的起始行位置是 1,而我们的高度是 2,那么我们将只访问第 1 行和第 2 行。如果我们从 1 开始并向上增加 height=2 元素,我们实际上会获取一个额外的元素,所以我们会得到第 1 行、第 2 行 3。我们不想要最后一行,所以减 1 有助于我们做到这一点。以类似的方式,如果我们希望访问一系列列元素,它也从左上角 (regionStartPoint(2)) 开始,并且我们希望访问 size_W(2) = width 元素,您最多可以访问 @ 987654332@ 元素。

因此,我们访问矩阵时,第一个参数指定所需的行范围,第二个参数指定所需的列范围。因为您的图像可能是彩色或灰度的,所以我使用: 作为最后一个参数,以便您可以获得所有的 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 中提取后处理的图像。这与您之前想要提取图像的一部分时看到的语法完全相同相同,但现在角色颠倒了。我们希望将这部分放回到图像中,因此您只需要交换赋值运算符 (=) 左侧和右侧的内容即可。


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

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

第一个输入是您要裁剪的图像,而第二个元素是一个由 4 个元素组成的数组,格式如下:

[x y w h]

xy 是您要提取的左上角的 columnrow 位置,而 w 和 @987654345 @ 是您要提取的部分的宽度和高度。如果你把它翻转了,regionStartPointcolumn 首先是 rowsizeW 有它这样 width 来首先是高度,这段代码将简化为:

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

在运行imcrop 之前,请确保[x y w h] 数组的顺序正确。


小提示

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

bitMSB = bitget(A, 8);

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


祝你好运!

【讨论】:

  • 感谢一百万花时间解释所有这些!
  • 我确实在使用 bitget 来获取位平面。获取 region_R 时,逗号后的 ... 是什么意思?我对嵌入的理解是:我将 1.隔离 R,2.从 R 中提取名为 D 的位平面,3. 压缩它,4. 得到一个称为 S 的周围空间的低位平面 5. 压缩它,6. 添加从 D 到 S 的位, 7. 将水印数据插入 R 8. 将区域插入图像中。连接6中的水印数据,我应该使用union()吗?
  • ... 表示进入下一行。我不希望整个命令适合一行,否则你会在页面上水平滚动:)
  • 如果“连接”是指继续将先前的结果连接到当前图像,请考虑使用logical OR。它将保留图像的大小,并允许您继续附加结果。例如,如果我有这个数组:A = logical([0 0 0 1 1 0 0 0 0]); 和这个数组B = logical([1 1 0 0 0 0 0 0 1]);,如果我们有C = A | B;,我们得到:C = logical([1 1 0 1 1 0 0 0 1]);|logical OR 运算符。请注意,这会将1 放置在AB1 的任何位置。
  • 啊好吧,我想我需要做的就是添加到最后,所以如果 A = [0 0 0 0 0 0 0 0 0 0 0 0 0] 和 B = [1 1 1 1 1 1 1 1] 那么它应该只给出 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 实际上,看起来联合只会导致 [0 1]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-10
  • 2011-11-09
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多