java 绘制六边形_JAVA代码怎么实现图像六边形网格分割效果
下面给大家介绍JAVA代码怎么实现图像六边形网格分割效果,希望能给大家提供帮助。
一:原理
根据输入参数blockSize的大小,将图像分块,决定每块的中心通过该像素块内所有像素之和的均值与该块内部每个像素比较,RGB值之间几何距离最小为新的中心,迭代更新运算,直到达到输入参数声明的最大循环次数为止,然后输出结果图像即可。
二:程序实现
类MyCluster,存储每个像素块中心的信息,计算中心位置。
类SuperPixelsFilter, 滤镜实现,完成六边形网格分割的主要功能,其中距离计算,基于欧几里德距离公式。
三:效果
原图:
效果:
四:完全源代码
package com.gloomyfish.image.cluster.effect;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import com.gloomyfish.filter.study.AbstractBufferedImageOp;
public class SuperPixelsFilter extends AbstractBufferedImageOp {
private double[] distances;
private int[] labels;
private MyCluster[] clusters;
private intmaxClusteringLoops=50;
private double blockSize;
private double modifier;
public SuperPixelsFilter()
{
blockSize=16;
modifier=130;
}
public double getBlockSize() {
return blockSize;
}
public void setBlockSize(double blockSize) {
this.blockSize= blockSize;
}
public double getModifier() {
return modifier;
}
public void setModifier(double modifier) {
this.modifier= modifier;
}
@Override
public BufferedImage filter(BufferedImage src, BufferedImage dest) {
intwidth=src.getWidth();
intheight=src.getHeight();
if (dest== null )
dest=createCompatibleDestImage( src, null );
int[]inPixels=newint[width*height];
getRGB( src, 0, 0, width, height, inPixels );
intindex=0;
// initialization
distances=newdouble[width*height];
labels=newint[width*height];
Arrays.fill(distances, Integer.MAX_VALUE);
Arrays.fill(labels, -1);
initClusters(width, height, inPixels, blockSize, modifier);
// loop to get all block/cells, image segmentation
intloops=0;
booleanpixelChangedCluster=true;
while (pixelChangedCluster&&loops
pixelChangedCluster=false;
loops++;
// for each cluster center C
for (inti=0;i
MyClusterc=clusters[i];
// for each pixel i in 2S region around
// cluster center
intxs=Math.max((int)(c.avg_x-blockSize),0);
intys=Math.max((int)(c.avg_y-blockSize),0);
intxe=Math.min((int)(c.avg_x+blockSize),width);
intye=Math.min((int)(c.avg_y+blockSize),height);
for (inty=ys;y
for (intx=xs;x
intpos=x+width*y;
inttr= (inPixels[pos]>>16) & 0xff;
inttg= (inPixels[pos]>>8) & 0xff;
inttb=inPixels[pos] & 0xff;
doubleD=c.distance(x, y, tr,
tg,
tb,
blockSize, modifier, width, height);
if ((D
distances[pos] = D;
labels[pos] = c.id;
pixelChangedCluster=true;
}
} // end for x
} // end for y
} // end for clusters
// reset clusters
for (index=0;index
clusters[index].reset();
}
// add every pixel to cluster based on label
for (inty=0;y
for (intx=0;x
intpos=x+y*width;
inttr= (inPixels[pos]>>16) & 0xff;
inttg= (inPixels[pos]>>8) & 0xff;
inttb=inPixels[pos] & 0xff;
clusters[labels[pos]].addPixel(x, y,
tr, tg, tb);
}
}
// calculate centers
for (index=0;index
clusters[index].calculateCenter();
}
}
// Create output image with pixel edges
for (inty=1;y
for (intx=1;x
intid1=labels[x+y*width];
intid2=labels[(x+1)+y*width];
intid3=labels[x+(y+1)*width];
if (id1!=id2||id1!=id3) {
intpos=x+y*width;
inPixels[pos] = (255<<24) | (0<<16) | (0<<8) | 0;
}
}
}
setRGB( dest, 0, 0, width, height, inPixels );
return dest;
}
public void initClusters(int width, int height, int[] input,
double S, double m) {
Listtemp=newArrayList();
booleaneven=false;
doublexstart=0;
intid=0;
for (doubley=S/ 2; y
// 创建六边形网格
if (even) {
xstart=S/ 2.0;
even=false;
} else {
xstart=S;
even=true;
}
for (doublex=xstart; x
intindex= (int) (x + y * width);
inttr= (input[index]>>16) & 0xff;
inttg= (input[index]>>8) & 0xff;
inttb=input[index] & 0xff;
MyClusterc=newMyCluster(id, tr, tg, tb,
(int) x, (int) y, S, m);
temp.add(c);
id++;
}
}
clusters=newMyCluster[temp.size()];
for (inti=0; i
clusters[i] = temp.get(i);
}
}
}
MyCluster类代码:
package com.gloomyfish.image.cluster.effect;
public class MyCluster {
int id;
doubleinv=0; // inv variable for optimization
double pixelCount; // pixels in this cluster
double avg_red; // average red value
double avg_green; // average green value
double avg_blue; // average blue value
double sum_red; // sum red values
double sum_green; // sum green values
double sum_blue; // sum blue values
double sum_x; // sum x
double sum_y; // sum y
double avg_x; // average x
double avg_y; // average y
public MyCluster(int id, int in_red, int in_green, int in_blue, int x,
int y, double S, double m) {
// inverse for distance calculation
this.inv=1.0 / ((S / m) * (S / m));
this.id= id;
addPixel(x, y, in_red, in_green, in_blue);
// calculate center with initial one pixel
calculateCenter();
}
public void reset() {
avg_red=0;
avg_green=0;
avg_blue=0;
sum_red=0;
sum_green=0;
sum_blue=0;
pixelCount=0;
avg_x=0;
avg_y=0;
sum_x=0;
sum_y=0;
}
/*
* Add pixel color values to sum of previously added color values.
*/
void addPixel(int x, int y, int in_red, int in_green, int in_blue) {
sum_x += x;
sum_y += y;
sum_red += in_red;
sum_green += in_green;
sum_blue += in_blue;
pixelCount++;
}
public void calculateCenter() {
// Optimization: using "inverse"
// to change divide to multiply
doubleinv=1/ pixelCount;
avg_red=sum_red* inv;
avg_green=sum_green* inv;
avg_blue=sum_blue* inv;
avg_x=sum_x* inv;
avg_y=sum_y* inv;
}
double distance(int x, int y, int red, int green, int blue, double S,
double m, int w, int h) {
// power of color difference between
// given pixel and cluster center
doubledx_color= (avg_red - red) * (avg_red - red)
+ (avg_green - green) * (avg_green - green) + (avg_blue - blue)
* (avg_blue - blue);
// power of spatial difference between
// given pixel and cluster center
doubledx_spatial= (avg_x - x) * (avg_x - x) + (avg_y - y)
* (avg_y - y);
// Calculate approximate distance D
// doubleD=dx_color+dx_spatial*inv;
// Calculate squares to get more accurate results
doubleD=Math.sqrt(dx_color) + Math.sqrt(dx_spatial * inv);
return D;
}
}
五:参考这里
该滤镜是SuperPixel算法的简单应用,多数时候,我们可能更熟悉K-Means等图像分割算法,其实SuperPixel是图像分割算法之一。
(责任编辑:6g下载网)
java 绘制六边形_JAVA代码怎么实现图像六边形网格分割效果相关推荐
- java图片降噪_Java基于opencv实现图像数字识别(四)—图像降噪
Java基于opencv实现图像数字识别(四)-图像降噪 我们每一步的工作都是基于前一步的,我们先把我们前面的几个函数封装成一个工具类,以后我们所有的函数都基于这个工具类 这个工具类呢,就一个成员变量 ...
- java绘制棋盘_java绘制五子棋棋盘
本文实例为大家分享了java绘制五子棋棋盘的具体代码,供大家参考,具体内容如下 源码: import javax.imageio.ImageIO; import javax.swing.*; impo ...
- java绘制五子棋_java绘制五子棋棋盘
免费资源网,https://freexyz.cn/ 本文实例为大家分享了java绘制五子棋棋盘的具体代码,供大家参考,具体内容如下 源码: import javax.imageio.ImageIO; ...
- java绘制图形_java绘制基本图形.doc
java绘制基本图形 java绘制基本图形 1. * *** ***** 2. * * * ***** 3. ************* * * * * ************* 4. ****** ...
- java语音验证码_Java代码示例_Java语音验证接口 | 微米-中国领先的短信彩信接口平台服务商...
Java语音验证接口代码示例 请求 import java.util.HashMap; import java.util.Map; public class IvrDemo { /** * 语音验证接 ...
- Unet简明代码实现眼底图像血管分割
Unet是一种自编码器网络结构,常用于医学图像分割任务,比如眼底图像血管分割.这位大佬已经开源了非常棒的代码,但是这套代码比较复杂,我初学菜鸟硬是啃了好几天才啃下来.现在我代码进行重写,仅保留最必 ...
- java 墨卡托 经纬度_JAVA代码根据经纬度范围计算WGS84与谷歌全球墨卡托包含的切片数目与拼接图像像素尺寸...
根据项目需求编写的代码. 适用场景:在网络地图上,比如天地图与谷歌地图,用户用鼠标在地图上拉一个矩形框,希望下载该矩形框内某一层级的瓦片数据,并将所有瓦片拼接成一个完整的,包含地理坐标的tif图像. ...
- java 绘制长方形_Java入门:绘制简单图形
在上一节,我们学习了如何使用swing和awt工具创建一个空的窗口,本节学习如何绘制简单图形. 基本绘图介绍 Java中绘制基本图形,可以使用Java类库中的Graphics类,此类位于java.aw ...
- 用Java绘制柱形图_Java使用JFreeChart绘制柱形图
JFreeChart是JAVA平台上的一个开放的图表绘制类库.它完全使用JAVA语言编写,是为applications, applets, servlets 以及JSP等使用所设计.JFreeChar ...
最新文章
- Python requests 笔记(一)
- 链表常见面试题二:约瑟夫环
- Confluence 6 为空白空间编辑默认主页
- svn之迁移代码技巧
- javascript学习系列(9):原数组发生变化的情况
- 苏宁易购回应破产传闻:系谣言 已报案
- linux 压缩权限,linux的基本操作(归档压缩,用户、权限管理,远程服务器构建和vi编辑器)...
- C++之文件操作探究(三):写文件——二进制文件
- solr suggest+autocomplete实现自动提示
- Linux学习总结(1)——Linux命令大全完整版
- 三维数据可视化软件html5,基于 HTML5 的 WebGL 自定义 3D 摄像头监控模型 | 3D组态|图扑软件|数据可视化|blog...
- 广东2018c语言二级答案,2018年3月全国计算机二级C语言练习题及答案(2)
- 简单的购物卡管理系统 可开源
- JAVA操作Excel时文字自适应单元格的宽度设置方法
- java异常之-ClassNotFoundException: .......web.context.ContextLoaderServlet
- 20154312 曾林 EXP6 信息搜集与漏洞扫描
- Spring工作原理。原理就是这么简单
- 因数分解 EduCoder习题
- Hadoop的完全分布式搭建
- 怎样批量下载贴吧图片
热门文章
- 耳朵音乐_开源PHP音乐程序_earcms.net
- 织梦做ajax提交,织梦用ajax提交自定义表单的办法-不跳转
- 如何创建一个基于Maven的SmartGWT项目
- 【软件工程】机票预订系统的用例图及用例说明
- 软件工程专业计算机二级考哪科比较好,计算机二级考哪个比较好 分别考什么...
- 为什么独立站卖家喜欢做电子邮件营销?原来转化率能提高这么多!
- json.converter
- android x11 ssh,用SSH实现X11转发
- 九、从华为HMS快速身份验证能力FIDO2看密码学知识
- centos linux 快捷键,centos 快捷键大全