我有一张黑白图像,如下所示:
我想分离此图像的白色组件,然后将它们另存为单独的图像。此图像有四个白色部分。我想将它们分开并保存四张新图像;每个都包含图像的白色部分。
为实现这一目标,我编写了以下代码:
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
此代码分隔白色部分并保存它们,但保存在新图像中的白色部分的大小与原始图像中的相同。请参阅下面的输出图像:
我希望输出图像包含原始图像白色部分的增大尺寸。以下图片是我想要的图片:
如何修改上述代码,以便获得所需的输出图像?
答案 0 :(得分:2)
找到白色部分的边界。
要包含黑色部分,请从左上角减去一个常量。如果它小于或等于零,则表示我们已达到或超过实际图像的左角,因此将其设置为1如果它大于零,那么一切都很好。
对右下角进行类似的调整。
裁剪到所需的大小。
%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);
您可以通过更改代码中的常量k
来更改黑色像素的数量。
如果白色部分位于边缘,请验证它是否也能正常工作:
代码为上图提供以下输出:
答案 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})
可以很容易地实现这一点,您必须调用它来提供您想要保留的矩形。
为了识别矩形:
imcrop
); y-axis
); x-axis
计算矩形的宽度和高度。maximum - minimum
进行裁剪(在我的示例中,我将其值设置为margin
,但您可以完全控制它),您必须将10
减去最小值值并将其添加到最大值,但注意不要超出图像的边界(小margin
游戏发挥作用的地方)。以下是完整的工作代码:
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
。
结果: