Matlab中实现正方像素点到六角像素点的赝转换(Pseudo-Hexgonalized)------MATLAB开发

利用MATLAB绘制基本元素为正六边形的图-Hexgonalized

Matlab的基本数据单位是矩阵或者张量,利用Matlab中的imwrite函数可以将矩阵数据直接写入tiff灰度图或者彩色图,图像的基本单位为像素点,而一个单位像素点通常为正方形,这里主要目的是用正六边形像素点替代正方形像素点。

MATLAB写入图像函数imwrite

Matlab中自带的imwrite函数能够将矩阵数据写入图像,基本语法为imwrite(A,map,filename), 将 A 中的索引图像及其关联的颜色图 map 写入由 filename 指定的文件。详情参考MATLAB帮助中心-imwrite.
示例1.(来源MATLAB帮助中心)
将一个 50×50 的灰度值数组写入当前文件夹中的 PNG 文件。
代码片

A = rand(50);
imwrite(A,"myGray.png")

MATLAB创建二维填充补片函数 fill & patch

这里考虑使用Matlab自带的fill函数或者patch函数来绘制六边形,事实上Matlab内置了nsidedpoly函数来绘制多边形,基本语法为
pgon = nsidedpoly(n,Name,Value)
详情参考MATLAB帮助中心-nsidepoly.
但是该函数无法直接调控多边形的面颜色以及边颜色等等参数,而且多边形的转角无法控制,因此选择自由度更高的fill或者patch函数来绘制基本像素单元。详情参考MATLAB帮助中心-fillMATLAB帮助中心-patch

网格化绘制六边形基本像素点—自建函数Hexpixel

patch(X,Y,C)以及fill(X,Y,C) 通过将 X 和 Y 指定为每个顶点的坐标来创建一个或多个彩色多边形补片。patch可以同时创建多个多边形,只需将 X 和 Y 指定为矩阵,其中每一列对应于一个不同多边形。C 决定补片颜色,每一列对应不同的多边形颜色,格式可以为RGB 值的 n×1×3 数组。该数组的第一页定义颜色的红色分量、第二页定义蓝色分量,第三页定义绿色分量。
将所有位置处六边形的X-Y坐标以及颜色C作为自变量输入。
p第一行为所有六边形的X坐标
p第二行为所有六边形的Y坐标
c为1×n×3的颜色数组,n为六边形的数量,第一页到第三页分别对应RGB颜色分量
函数Hexpixel(p,c)

function [] = Hexpixel(p,c)
% p ~ 2dimensional position
% c ~ color
Hex_d = 1;
R = Hex_d*cot(pi/6)/4;
theta = pi/6*ones(1,6+1)+(0:1/6:1)*2*pi;
r = R/cos(2*pi/2/6)*ones(1,6+1);
[x,y]=pol2cart(theta,r);
x = repmat(x',1,size(p,2));
y = repmat(y',1,size(p,2));
px = repmat(p(1,:),size(x,1),1);
py = repmat(p(2,:),size(x,1),1);
%fill(x+px,y+py,c,'EdgeColor','none');
patch(x+px,y+py,c,'EdgeColor','none');
axis equal
end

正方像素点到六方像素点坐标位置转换

一般在图像中左上角为原点,x-轴正方向向右且y-轴正方向向下,这与一般绘图坐标不同,在一般绘图坐标中是x-轴正方向向右且y-轴正方向向上,因此从图像坐标到绘图坐标需要转换;在正方形像素点绘图中,每个像素点的实际坐标位置与格位数对应简单,而在六方像素点中每个像素点的实际坐标位置需要从格位数经过一系列较复杂的转换得到:
假设x为沿x-轴的格位数且y为沿y-轴的格位数
假设转换为六方像素点后沿x-轴方向为zigzag/沿y-轴方向为armchair
则可以通过如下代码进行转换:
代码片

% convert to triangular lattice position
if mod(y,2) == 0
	Hex_pos(1,1) = ((x-1)+0.5)/2*sqrt(3);
    Hex_pos(1,2) = -(y-1)/2*sqrt(3)*cos(pi/6);
else
    Hex_pos(1,1) = (x-1)/2*sqrt(3);
    Hex_pos(1,2) = -(y-1)/2*sqrt(3)*cos(pi/6);

Pseudo-Hexgonalized最终效果展示

Hexgonalizde
如上图所示左图为原始图片60×60个pixel,大小仅为276字节,而右图为Hexgonalized的结果1244×1075个pixel,大小为152kB:从原始数据中提取出每个像素点的格点位置以及对应的颜色RGB三分量,将格点位置转换为新坐标后在对应的新坐标上使用fill或者patch函数绘制正六边形。转换后实际像素点或者分辨率由函数exportgraphics中设置的resolution决定。详情参考MATLAB帮助中心-exportgraphics。原理上并不是将图片中基本像素点变成了六边形,而是通过更多的正方像素点组成了基本元素-六边形,因此实际上为Pseudo-Hexgonalized。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NBb-666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值