如何使用 RGB 值在图像周围正确创建轮廓?

How to properly create outline around image using RGB values?

我有一张导入 Octave 5.2 的图像,我想使用 RGB 值围绕图像阵列创建一个轮廓。

我无法将 RGB 值正确插入数组,一直插入/生成顶部的两行、左侧的两列、右侧的两列和底部的两行图像周围/转换后的 double 数组。

原图示例:

完成后我尝试获取的图像示例:

我的逻辑是:

  1. 将图像转换为 double 数组,以便我可以进行数学计算/在我想要的位置插入 RGB 值。

  2. 将 RGB 值插入数组的左、右、上、下。

  3. double 数组转换回 uint8 以将其作为图像导出/查看。

到目前为止我的代码:

pkg load image
   
img_fn=('https://i.imgur.com/KKxJaOy.png'); %original image

f=imread(img_fn);
[im_r im_c]=size(f);
size_min=min(im_r,im_c); %get minum size from row and col
    
f_double=double(f); %need to convert to double to do math functions on it
    
outline_left_of_box=repmat(255,[rows(f_double),2]); %Create left line array of outline red box
f_double_tmp_red(:,:,1)=[outline_left_of_box,f_double];%Create left line of outline red box

red_outline_right_of_box=repmat(255,[rows(f_double),2]); %Create right line array of outline red box

red_outline_top_of_box=repmat(255,[2,columns(f_double)]); %Create top line array of outline red box

red_outline_bottom_of_box=repmat(255,[2,columns(f_double)]); %Create bottom line array of outline red box
    
%convert back to image
red_outline_img=uint8(f_double);

imshow(red_outline_img);  %used to show image in octave plot window

请注意:我正在将图像数组转换为 double,因为将对数组进行计算以获得图像周围所需的颜色框,但我只是想插入首先修复 RGB 值到数组的问题。

也许将输入图像的内部简单地粘贴到具有所需边框颜色的某些“背景”图像上会更容易,如下所示:

pkg load image

% Read image, get dimensions, convert to double
f = imread('https://i.imgur.com/KKxJaOy.png');
[im_ro, im_co, im_ch] = size(f);
f_double = double(f);

% Set up width and color of border
bw = 2;
color = ones(1, 1, im_ch);
color(1, 1, :) = [255, 0, 0];

% Create image of same size as input with solid color, and paste inner part of input
red_outline_img = ones(im_ro, im_co, im_ch) .* color;
red_outline_img(bw+1:end-bw, bw+1:end-bw, :) = f_double(bw+1:end-bw, bw+1:end-bw, :);
red_outline_img = uint8(red_outline_img);
imshow(red_outline_img);

这就是输出:

您可以尝试的另一件事是按照您的建议绘制线条,巧妙地使用 xlim/ylim 可以非常有效地完成此操作,然后将整个内容打印为 - RGBImage 以图像形式取回它。

这里唯一需要注意的是,您需要尝试使用格式选项来获得您真正想要的内容(例如,如果您想要更高或更低的分辨率),因为您实际上是在打印屏幕上的内容此时。

例如

L = imread('leaf.png');
imshow(L)
hold on
plot( [xlim, fliplr(xlim);xlim, xlim], [ylim, ylim;fliplr(ylim), ylim], 'r', 'linewidth', 2 )
hold off
set( gca, 'position', [0, 0, 1, 1] );
set( gcf, 'paperposition', [0, 0, 1, 1] );
R = print( '-RGBImage' );
close
imshow(R); set( gcf, 'color', 'k'); axis off