分离图像的组件并将其保存为新图像

时间:2017-11-26 13:46:18

标签: image matlab image-processing crop

我有一张黑白图像,如下所示:

inputimage

我想分离此图像的白色组件,然后将它们另存为单独的图像。此图像有四个白色部分。我想将它们分开并保存四张新图像;每个都包含图像的白色部分。

为实现这一目标,我编写了以下代码:

BW=imread('img11_Inp.jpg');
imshow(BW);
BW=imbinarize(BW);

[L, num] = bwlabel(BW);
for k = 1 : num
    thisBlob = ismember(L, k);
    h = int2str(k);
    filname = strcat(h,'_Out.jpg');
    imwrite(thisBlob,filname);
    figure
    imshow(thisBlob, []);
end

问题

此代码分隔白色部分并保存它们,但保存在新图像中的白色部分的大小与原始图像中的相同。请参阅下面的输出图像:

输出图像

out1 out2 out3 out4

所需的输出图像

我希望输出图像包含原始图像白色部分的增大尺寸。以下图片是我想要的图片:

reqout1 reqout2 reqout3 reqout4

问题

如何修改上述代码,以便获得所需的输出图像?

2 个答案:

答案 0 :(得分:2)

步骤:

  1. 找到白色部分的边界。

  2. 要包含黑色部分,请从左上角减去一个常量。如果它小于或等于零,则表示我们已达到或超过实际图像的左角,因此将其设置为1如果它大于零,那么一切都很好。

  3. 对右下角进行类似的调整。

  4. 裁剪到所需的大小。

  5. 代码:

    %Finding the boundary of the white
    [~, c1] = find(thisBlob, 1);             [~, r1] = find(thisBlob.', 1);
    [~, c2] = find(thisBlob, 1, 'last');     [~, r2] = find(thisBlob.', 1, 'last');
    
    %Making adjustments to include the black portion
    k = 10;            %constant defining max number of black pixels
    mxlim = size(X);   %to be used to confirm that we don't exceed the boundary of the image
    r1 = r1-10;  r1(r1<=0)=1;                    c1 = c1-10;  c1(c1<=0)=1;
    r2 = r2+10;  r2(r2>mxlims(1)) = mxlim(1);    c2 = c2+10;  c2(c2>mxlim(2)) = mxlims(2);
    
    %Extracting the desired portion
    thisBlob = thisBlob(r1:r2, c1:c2);
    

    提供的图像的输出:

    output1 output2 output3 output4

    您可以通过更改代码中的常量k来更改黑色像素的数量。

    白色部分位于边缘时的测试用例:

    如果白色部分位于边缘,请验证它是否也能正常工作:

    input2

    代码为上图提供以下输出:

    output5

答案 1 :(得分:1)

实际上,您想要执行的是在对象周围有一点点跨度的裁剪。使用def model(x, x_size): with tf.variable_scope("my_net", reuse=tf.AUTO_REUSE): W1 = tf.get_variable('w1', [x_size, x_size], initializer=tf.random_normal_initializer()) b1 = tf.get_variable('b1', [x_size], initializer=tf.random_normal_initializer()) y1 = tf.nn.relu(tf.matmul(x, W1) + b1,'y1') return y1 eval_x = tf.placeholder(tf.float32, name='eval_x', shape=[None, x_size]) eval_probs = model(eval_x, x_size) with tf.Session() as sess: new_saver = tf.train.import_meta_graph('save_model/model.ckpt.meta') new_saver.restore(sess, "save_model/model.ckpt") probs = sess.run(eval_probs, feed_dict={eval_x: test_x}) 可以很容易地实现这一点,您必须调用它来提供您想要保留的矩形。

为了识别矩形:

  1. 找到包含白色像素(imcrop);
  2. 的最小行数
  3. 找到包含白色像素(y-axis);
  4. 的最小列数
  5. 使用x-axis计算矩形的宽度和高度。
  6. 由于您想要使用一点maximum - minimum进行裁剪(在我的示例中,我将其值设置为margin,但您可以完全控制它),您必须将10减去最小值值并将其添加到最大值,但注意不要超出图像的边界(小margin游戏发挥作用的地方)。
  7. 以下是完整的工作代码:

    min-max

    另外,请勿使用img = imread('img11_Inp.jpg'); imshow(img); img_bin = imbinarize(img); [lab,num] = bwlabel(img_bin); span = 10; for k = 1:num file = [num2str(k) '_Out.jpg']; blob = ismember(lab,k); blob_size = size(blob); col_idx = find(any(blob == true,1)); x1 = max([1 (min(col_idx) - span)]); x2 = min([blob_size(2) (max(col_idx) + span)]); width = x2 - x1; row_idx = find(any(blob == true,2)); y1 = max([1 (min(row_idx) - span)]); y2 = min([blob_size(1) (max(row_idx) + span)]); height = y2 - y1; blob_crop = imcrop(blob,[x1 y1 width height]); imwrite(blob_crop,file); figure(); imshow(blob_crop,[]); end 来获取索引的字符串表示形式。你的索引实际上是int2str(k),所以你强迫一个双重(没有双关语)演员:double然后double -> int。只需使用int -> char array

    结果:

    Crop