如何使用MATLAB自动填充仲裁图像?

use*_*729 2 matlab image-processing

这是基于这个答案的进一步问题:

如何在MATLAB中实现鱼眼镜头效果(桶形变换)?

一般解决方案应适用于所有背景颜色和长/宽比.

gno*_*ice 5

通常情况下,在MATLAB中有许多不同的方法可以做到这一点.我将列出几个填充RGB图像的例子......

解决方案#1:使用CAT添加填充以生成方形图像

此解决方案采用给定的颜色padColor并使用函数REPMAT复制它以创建正确大小,形状和颜色的填充.然后使用CAT函数将填充添加到图像的两侧:

[r,c,d] = size(rgbImage);  %# Get the image dimensions
nPad = abs(c-r)/2;         %# The padding size
padColor = [1 1 1];        %# RGB triple for pad color (white)
padColor = reshape(padColor,1,1,3);  %# Reshape pad color to 1-by-1-by-3
if c > r                   %# Pad rows
  newImage = cat(1,repmat(padColor,floor(nPad),c),...  %# Top padding
                   rgbImage,...                        %# Image
                   repmat(padColor,ceil(nPad),c));     %# Bottom padding
elseif r > c               %# Pad columns
  newImage = cat(2,repmat(padColor,r,floor(nPad)),...  %# Left padding
                   rgbImage,...                        %# Image
                   repmat(padColor,r,ceil(nPad)));     %# Right padding
end
Run Code Online (Sandbox Code Playgroud)

您可以修改上述解决方案,以便通过使用以下方法之一替换定义的两条线来处理索引图像,灰度图像二进制图像padColor:

padColor = uint8(1);    %# For an indexed image (index of color to use)
padColor = uint8(255);  %# For a grayscale image (white)
padColor = true;        %# For a binary image (white)
Run Code Online (Sandbox Code Playgroud)


解决方案#2:制作一个空白方形图像并插入原始图像

此解决方案采用给定的颜色padColor并使用函数REPMAT复制它以创建该颜色的空白方形图像.然后将原始图像插入到居中位置的此空白图像中:

[r,c,d] = size(rgbImage);  %# Get the image dimensions
padColor = [1 1 1];        %# RGB triple for pad color (white)
padColor = reshape(padColor,1,1,3);  %# Reshape pad color to 1-by-1-by-3
if c > r                   %# Pad rows
  newImage = repmat(padColor,c);  %# Make c-by-c-by-3 matrix of given color
  rowIndex = floor((c-r)/2);      %# Row index for inserting image
  newImage(rowIndex+(1:r),:,:) = rgbImage;     %# Insert the image
elseif r > c               %# Pad columns
  newImage = repmat(padColor,r);  %# Make r-by-r-by-3 matrix of given color
  columnIndex = floor((r-c)/2);   %# Column index for inserting image
  newImage(:,columnIndex+(1:c),:) = rgbImage;  %# Insert the image
end
Run Code Online (Sandbox Code Playgroud)

您可以修改上述解决方案,以便通过使用以下方法之一替换定义的两条线来处理索引图像,灰度图像二进制图像padColor:

padColor = uint8(1);    %# For an indexed image (index of color to use)
padColor = uint8(255);  %# For a grayscale image (white)
padColor = true;        %# For a binary image (white)
Run Code Online (Sandbox Code Playgroud)


解决方案#3:使用PADARRAY

此解决方案使用函数PADARRAY创建填充以使图像成方形.不幸的是,使用此解决方案时,没有简单的方法来指定RGB图像所需的填充颜色(见下文).但是,您可以使用'replicate'参数让PADARRAY简单地复制图像边缘处添加填充的颜色:

[r,c,d] = size(rgbImage);  %# Get the image dimensions
nPad = abs(c-r)/2;         %# The padding size
if c > r                   %# Pad rows
  newImage = padarray(rgbImage,[floor(nPad) 0],...  %# Pad top
                      'replicate','pre');
  newImage = padarray(newImage,[ceil(nPad) 0],...   %# Pad bottom
                      'replicate','post');
elseif r > c               %# Pad columns
  newImage = padarray(rgbImage,[0 floor(nPad)],...  %# Pad left
                      'replicate','pre');
  newImage = padarray(newImage,[0 ceil(nPad)],...   %# Pad right
                      'replicate','post');
end
Run Code Online (Sandbox Code Playgroud)

此解决方案适用于索引,灰度二进制图像.对于这三种图像类型,您可以选择'replicate'使用要用于填充的标量值替换参数(即,uint8(255)用于灰度图像中的白色填充).对于RGB图像,'replicate'使用单个值替换参数将只允许您创建从白色到黑色的灰色阴影的填充颜色(即1创建白色填充).