使用insertShape修改线条样式

5次浏览(最近30天)
粘土Swackhamer
粘土Swackhamer 2017年9月15日
评论道: 粘土Swackhamer 2017年9月19日
你好,
我写了一个函数在图像上做网格。我既可以在图像上绘制网格,也可以将其刻录/插入图像中,这取决于用户的输入。我也可以修改线的宽度和样式-但只适用于“绘制”方法,因为我似乎无法使用修改线的样式 insertShape。 有人知道怎么做吗?我会把代码贴出来。上面有一个draw方法和burn方法的例子。两者都应该运行并使用默认映像。谢谢。
粘土
函数[varargout] = imageGrid(I, varargout)
% imcirclecrop在图像上添加网格
%例1:
% I = imread('rice.png');
% vertLines = 10;
%地平线= 10;
% lineWidth = 2;
% imshow(我);
% Igrid = imageGrid(I, 'vertLines', vertLines, 'horzLines', horzLines, 'lineWidth', lineWidth, 'lineStyle', ':', 'technique', 'Draw');
%例2:
% I = imread('cameraman.tif');
% vertLines = 15;
%地平线= 10;
% lineWidth = 1;
% imshow(我);
% Igrid = imageGrid(I, 'vertLines', vertLines, 'horzLines', horzLines, 'lineWidth', lineWidth, 'lineStyle', ':', 'technique', 'burn');
% imshowpair(I, Igrid, '蒙太奇')
%%%%%%%%%%%%%%%%%%%%%%%%%%%
%设置默认值
defaultVertLines = 10;
defaultHorzLines = 10;
defaultLineWidth = 1;
defaultLineStyle =“:”
defaultTechnique =“画”
p = inputParser;
p. casessensitive = false;
p.KeepUnmatched = true;%存储额外的输入而不是抛出错误
addRequired (p,“我”);
addOptional (p,“vertLines”, defaultVertLines);
addOptional (p,“horzLines”, defaultHorzLines);
addOptional (p,“线宽”, defaultLineWidth);
addOptional (p,“线型”, defaultLineStyle);
addOptional (p,“技术”, defaultTechnique);
%解析输入
解析(p, I, varargin{:});
vertLines = p.Results.vertLines;
horzLines = p.Results.horzLines;
lineWidth = p.Results.lineWidth;
结果技术;
lineStyle = p.Results.lineStyle;
drawCases = {“画”};
drawLogical = strcmpi(technique, drawCases);如果'technique'是'draw'的变体,则为True
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
horzTicks = round(linspace(1, size(I,1), horzLines),0);%cols,我们将在这里画垂直线
vertTicks = round(linspace(1, size(1, 2), vertLines),0);%行,我们将在其中绘制水平线
max = size(I,1);%num像素在Y
maxX = size(1,2);%num像素在X
如果drawLogical%绘制当前图像
i = 1:1:vertLines
line([vertTicks(i), vertTicks(i)], [maxY, 0],“线宽”线宽,“颜色”“k”“线型”、线型);%画垂直线
结束
i = 1:1:horzLines
line([0, maxX], [horzTicks(i), horzTicks(i)],“线宽”线宽,“颜色”“k”“线型”、线型);%画水平线
结束
varargout {1} =“完成”
其他的刻录/插入线条到图像中
按ShapeInserter想要的方式把线坐标放在一起
% [x1_line1, y1_line1, x2_line1, y2_line1;…]
% x1_line2, y1_line2, x2_line2, y2_line2]
Vlines = 0 (length(vertTicks),4);
Vlines(:,1) = vertTicks;
Vlines(:,2) = 0;
Vlines(:,3) = vertTicks;
Vlines(:,4) = max;
Hlines = 0 (length(horzTicks), 4);
Hlines(:,1) = 0;
Hlines(:,2) = horzTicks;
Hlines(:,3) = maxX;
Hlines(:,4) = horzTicks;
把两者放在一起
lines = vertcat(Vlines, Hlines);
Lines = int32(Lines);
插入它们并输出修改后的图像
Igrid = insertShape(I,“行”、线、“线宽”线宽,“颜色”“黑”);
varargout{1} =网格;
结束
结束%结束imageDrawGrid ()

接受的答案

邓肯Lilley
邓肯Lilley 2017年9月19日
一种可能的解决方法是创建一个新图形,在坐标轴上显示图像,并使用坐标轴的网格线来显示所需的网格。然后,通过提取坐标轴上的颜色数据,可以将这些线“烧”到图像中。
请注意,由于MATLAB可以在图像不适合屏幕时自动调整图像的大小,因此对于大于屏幕的图像可能无法正确工作。
考虑下面的代码:
%%为映像创建新图形
FIG =图;
%%绘制图像
imshow(我);
%%格式化坐标轴
Ax = gca;
斧子。可见=“上”
轴(ax,“平等”);
网格(ax,“上”);
%设置行属性
斧子。LineWidth = LineWidth;
斧子。GridAlpha = 1;
斧子。GridColor =“k”
斧子。GridLineStyle = lineStyle;
%删除x轴和y轴
ax.XAxis.Visible =“关闭”
ax.YAxis.Visible =“关闭”
%设置网格线的间距
斧子。XTick = horzTicks;
斧子。YTick = vertTicks;
删除图像周围的任何多余空间
斧子。XLim = [0, maxX];
斧子。= [0, max];
设置坐标轴的大小与图像的大小相同
斧子。单位=“像素”
斧子。Position = [ax.Position(1),ax.Position(2), maxX, maxY];
%%从坐标轴获取图像数据
这将有网格线烧进图像
Igrid = getframe(ax);
Igrid = grid.cdata;
如果初始图像为黑白,则将新图像平展为。%
%匹配格式
如果size(I,3) == 1
网格= rgb2gray(网格);
结束
%关闭图形进行清理
关闭(图);
varargout{1} =网格;
1评论
粘土Swackhamer
粘土Swackhamer 2017年9月19日
嗨,邓肯,
谢谢你的回答。不幸的是,我的图像分辨率比显示器高。此外,我想保存这些网格图像,而不显示它们,因为我是批量处理图像。无论如何,这确实给了我另一个想法,所以我很感激。
我想我总是可以“手动”使用一些循环来遍历图像并将像素设置为所需的颜色。我担心这可能会很困难,尤其是创建带有虚线之类的图像。
谢谢,
粘土

登录评论。

更多答案(0)

社区寻宝

在MATLAB Central中寻找宝藏,并了解社区如何帮助您!

开始狩猎!