Atitit 图像扫描器---基于扫描线
Atitit 图像扫描器---基于扫描线
调用范例
* @throws FileExistEx
*/
public static void main(String[] args) throws FileExistEx {
String s = "C:\\00p\\a1115_210836_162 dilate.jpg.png";
String ext = filex.getExtName(s);
// s="C:\\00capch\\p5.jpg";
BufferedImage src = imgx.toImg(s);
ImgTraver_lineScaner trvr = new ImgTraver_lineScaner().setSrc(src);
trvr.cur_Pix_Point_process_Fun_Handler = pnt -> {
int rgb = src.getRGB(pnt.x, pnt.y);
HSV hsv = ColorUtil.rgb2hsv(rgb);
// System.out.println(pnt+ "hsv:"+hsv);
if (hsv.v < 0.6) // dark clolor
throw new CurPixArrivdBoderEx();
};
Rectangle rect = trvr.trav();
package com.attilax.img;
import java.awt.Color;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.util.function.Function;
import com.attilax.img.other.CurPixArrivdBoderEx;
import com.attilax.img.other.LineArrivdBorderEx;
import com.attilax.img.other.NewLineColorCheck;
import com.attilax.img.other.ProcessPointColor;
import com.attilax.io.FileExistEx;
import com.attilax.io.filex;
public class ImgTraver_lineScaner {
public static void main(String[] args) {
String s = "C:\\00p\\a1115_210836_162 dilate.jpg";
// s="C:\\00capch\\p5.jpg";
BufferedImage src = imgx.toImg(s);
// Rectangle rect=new ImgTraver_lineScaner().setSrc(src)
//new Rectangle(x, y, width, height)
// t();
System.out.println("--f");
}
private static void t() {
BufferedImage dest = null ;//= new DilateFilterV3().filter(src, null);
// BufferedImage dest= imgx.clone(src);
try {
imgx.save_png(dest, "C:\\00p\\a" + filex.getUUidName() + " dilate.jpg",false);
} catch (FileExistEx e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public BufferedImage getSrc() {
return src;
}
public ImgTraver_lineScaner setSrc(BufferedImage src) {
this.src = src;return this;
}
public void trave_downScan_lineByline(BufferedImage src, Point ini_select_Point_just4x) throws LineArrivdBorderEx {
int width = src.getWidth();
int height = src.getHeight();
for (int y = ini_select_Point_just4x.y; y < height; y++) {
scanLine(src, ini_select_Point_just4x, y);
}
}
public void trave_toDownScan_lineByline(BufferedImage src, Point ini_select_Point_just4x) throws LineArrivdBorderEx, CurPixArrivdBoderEx {
int width = src.getWidth();
int height = src.getHeight();
for (int y = ini_select_Point_just4x.y; y < height; y++) {
scanLineV2(src, ini_select_Point_just4x, y);
}
}
public ProcessPointColor cur_Pix_Point_process_Fun_Handler;
public Function<Integer,Boolean> checkIsMeetBorderPix_Handler;
public Function new_line_upNdown_evt_handler;
public Function new_line_scanFinish_evt_handler;
private BufferedImage src;
//public NewLineColorCheck newLineFirstColorCheckFun;
private void scanLine(BufferedImage src, Point ini_selectedPoint, int y) throws LineArrivdBorderEx {
new_line_upNdown_evt_handler.apply(new Point(ini_selectedPoint.x,y));
int cur_line_point_color = src.getRGB(ini_selectedPoint.x, y);// x is ini,y is next line point
if (checkIsMeetBorderPix_Handler.apply(cur_line_point_color))
throw new LineArrivdBorderEx();
// left scan
try {
leftScan(src, ini_selectedPoint, y);
} catch (CurPixArrivdBoderEx e) {
}
// right scan
try {
rightScan(src, ini_selectedPoint, y);
} catch (CurPixArrivdBoderEx e) {
}
}
private void scanLineV2(BufferedImage src, Point ini_selectedPoint, int y) throws LineArrivdBorderEx, CurPixArrivdBoderEx {
if(new_line_upNdown_evt_handler!=null)
new_line_upNdown_evt_handler.apply(new Point(ini_selectedPoint.x,y));
int cur_line_point_color = src.getRGB(ini_selectedPoint.x, y);// x is ini,y is next line point
if(checkIsMeetBorderPix_Handler!=null)
if (checkIsMeetBorderPix_Handler.apply(cur_line_point_color))
throw new LineArrivdBorderEx();
// left scan
leftScan(src, ini_selectedPoint, y);
// right scan
rightScan(src, ini_selectedPoint, y);
}
public void trave_upScan_lineByLine(BufferedImage src, Point ini_selectedPoint) throws LineArrivdBorderEx {
int width = src.getWidth();
int height = src.getHeight();
// ini_select_color_int = src.getRGB(ini_selectedPoint.x, ini_selectedPoint.y);
for (int y = ini_selectedPoint.y-1; y >0; y--) {
scanLine(src, ini_selectedPoint, y);
}
}
public void trave_toUpScan_lineByLine(BufferedImage src, Point ini_selectedPoint) throws LineArrivdBorderEx, CurPixArrivdBoderEx {
int width = src.getWidth();
int height = src.getHeight();
// ini_select_color_int = src.getRGB(ini_selectedPoint.x, ini_selectedPoint.y);
for (int y = ini_selectedPoint.y-1; y >0; y--) {
scanLineV2(src, ini_selectedPoint, y);
}
}
public void trave_toRitScan_lineByLine(int startX) throws LineArrivdBorderEx, CurPixArrivdBoderEx {
int width = src.getWidth();
int height = src.getHeight();
// ini_select_color_int = src.getRGB(ini_selectedPoint.x, ini_selectedPoint.y);
for (int x = startX; x<src.getWidth(); x++) {
scanLine_vert(x);
//scanLine(src, ini_selectedPoint, y);
if(new_line_scanFinish_evt_handler!=null)
new_line_scanFinish_evt_handler.apply(null);
}
}
/**
attilax 2016年11月16日 下午3:13:00
* @param src
* @param x
* @throws CurPixArrivdBoderEx
*/
@Deprecated
private void scanLine_vert_toRit(BufferedImage src, int x) throws CurPixArrivdBoderEx {
for (int y = 0; y<src.getHeight(); y++) {
if(x==15)
System.out.println("dbg");
Point preLeftPoint=new Point(x, y);
if(x<9)
{
System.out.println("dbg");
}
int clr=src.getRGB(preLeftPoint.x,preLeftPoint. y);
//if(checkIsMeetBorderPix_Handler.apply(clr))
this.cur_Pix_Point_process_Fun_Handler.apply(preLeftPoint);
//
}
}
public Point nowPoint;
public void trave_toLeftScan_lineByLine(int startX) throws LineArrivdBorderEx {
int width = src.getWidth();
int height = src.getHeight();
// ini_select_color_int = src.getRGB(ini_selectedPoint.x, ini_selectedPoint.y);
for (int x=startX;x>0;x--) {
try {
scanLine_vert( x);
} catch (CurPixArrivdBoderEx e) {
throw new LineArrivdBorderEx();
}
}
}
/**
attilax 2016年11月16日 下午3:23:11
* @param x
* @throws CurPixArrivdBoderEx
*/
private void scanLine_vert(int x) throws CurPixArrivdBoderEx {
for (int y = 0; y<src.getHeight(); y++) {
nowPoint=new Point(x, y);
if(x==15)
System.out.println("dbg");
Point preLeftPoint=new Point(x, y);
if(x<9)
{
System.out.println("dbg");
}
int clr=src.getRGB(preLeftPoint.x,preLeftPoint. y);
//if(checkIsMeetBorderPix_Handler.apply(clr))
this.cur_Pix_Point_process_Fun_Handler.apply(preLeftPoint);
//
}
}
/**
* left and curSelectPoint
* @param src
* @param ini_selectedPoint
* @param y
* @throws CurPixArrivdBoderEx
*/
private void leftScan(BufferedImage src,Point ini_selectedPoint, int y) throws CurPixArrivdBoderEx {
for (int x = ini_selectedPoint.x; x > 0; x--) {
if(x==15)
System.out.println("dbg");
Point preLeftPoint=new Point(x, y);
if(x<9)
{
System.out.println("dbg");
}
int clr=src.getRGB(preLeftPoint.x,preLeftPoint. y);
//if(checkIsMeetBorderPix_Handler.apply(clr))
this.cur_Pix_Point_process_Fun_Handler.apply(preLeftPoint);
//
}
}
private void rightScan(BufferedImage src, Point selectedPoint, int y) throws CurPixArrivdBoderEx {
//int select_color_int = src.getRGB(selectedPoint.x, selectedPoint.y);//-65536 red
//Color curClr=new Color(ini_select_color_int);
for (int x = selectedPoint.x+1; x < src.getWidth(); x++) {
Point nextRightPoint=new Point(x, y);
nowPoint=nextRightPoint;
this.cur_Pix_Point_process_Fun_Handler.apply(nextRightPoint);
}
}
/**
attilax 2016年11月9日 下午6:47:18
* @param img
* @param startPixPoint
*/
public void scan_Byline_from_startPixPoint(BufferedImage img, Point startPixPoint) {
try {
trave_downScan_lineByline(img, startPixPoint);
} catch (LineArrivdBorderEx e) {
}
try {
trave_upScan_lineByLine(img, startPixPoint);
} catch (LineArrivdBorderEx e) {
}
}
/**
attilax 2016年11月16日 下午3:37:24
* @return
*/
public Rectangle trav() {
int lastX = 0; int x = 0;int y = 0;int lastY = 0;
try {
trave_toLeftScan_lineByLine(src.getWidth()-1);
} catch (LineArrivdBorderEx e ) {
System.out.println(e.getMessage());
lastX=nowPoint.x;
if(lastX+2 <src.getWidth())
lastX=lastX+2;
}
try {
trave_toRitScan_lineByLine(0);
} catch (LineArrivdBorderEx | CurPixArrivdBoderEx e) {
System.out.println(e.getMessage());
x=nowPoint.x;
if(x-1!=0)
x=x-1;
}
try {
trave_toDownScan_lineByline(src,new Point(0,0) );
} catch (LineArrivdBorderEx | CurPixArrivdBoderEx e) {
System.out.println(e.getMessage());
y=nowPoint.y;
if(y-1!=0)
y=y-1;
}
try {
trave_toUpScan_lineByLine(src, new Point(0,src.getHeight()-1 ));
} catch (LineArrivdBorderEx | CurPixArrivdBoderEx e) {
System.out.println(e.getMessage());
lastY=nowPoint.y;
if(lastY+2 <src.getHeight())
lastY=lastY+2;
}
return new Rectangle(x, y, lastX-x, lastY-y);
}
}
作者:: 绰号:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿尔 拉帕努伊 )
汉字名:艾提拉(艾龙), EMAIL:1466519819@qq.com
转载请注明来源: http://www.cnblogs.com/attilax/
Atiend
Atitit 图像扫描器---基于扫描线的更多相关文章
- Atitit 图像金字塔原理与概率 attilax的理解总结qb23
Atitit 图像金字塔原理与概率 attilax的理解总结qb23 1.1. 高斯金字塔 ( Gaussianpyramid): 拉普拉斯金字塔 (Laplacianpyramid):1 1.2 ...
- Atitit 图像清晰度 模糊度 检测 识别 评价算法 源码实现attilax总结
Atitit 图像清晰度 模糊度 检测 识别 评价算法 源码实现attilax总结 1.1. 原理,主要使用像素模糊后的差别会变小1 1.2. 具体流程1 1.3. 提升性能 可以使用采样法即可..1 ...
- Atitit 图像清晰度 模糊度 检测 识别 评价算法 原理
Atitit 图像清晰度 模糊度 检测 识别 评价算法 原理 1.1. 图像边缘一般都是通过对图像进行梯度运算来实现的1 1.2. Remark: 1 1.3. 1.失焦检测. 衡量画面模糊的主要方 ...
- Atitit.prototype-base class-based 基于“类” vs 基于“原型”
Atitit.prototype-base class-based 基于“类” vs 基于“原型” 1. 基于“类” vs 基于“原型”1 2. 对象的产生有两种基本方式.一种是以原型(proto ...
- 图像切割—基于图的图像切割(Graph-Based Image Segmentation)
图像切割-基于图的图像切割(Graph-Based Image Segmentation) Reference: Efficient Graph-Based Image Segmentation ...
- 基于稀疏表示的图像超分辨率《Image Super-Resolution Via Sparse Representation》
由于最近正在做图像超分辨重建方面的研究,有幸看到了杨建超老师和马毅老师等大牛于2010年发表的一篇关于图像超分辨率的经典论文<ImageSuper-Resolution Via Sparse R ...
- 基于传统方法点云分割以及PCL中分割模块
之前在微信公众号中更新了以下几个章节 1,如何学习PCL以及一些基础的知识 2,PCL中IO口以及common模块的介绍 3,PCL中常用的两种数据结构KDtree以及Octree树的介绍 ...
- Atitit s2018 s3 doc list alldvc.docx .docx s2018 s3f doc compc s2018 s3f doc homepc sum doc dvcCompc dtS312 s2018 s3f doc compc\Atitit PathUtil 工具新特性新版本 v8 s312.docx s2018 s3f doc compc\Atitit 操作日
Atitit s2018 s3 doc list alldvc.docx .docx s2018 s3f doc compc s2018 s3f doc homepc sum doc dvcCompc ...
- Atitit s2018.2 s2 doc list on home ntpc.docx \Atiitt uke制度体系 法律 法规 规章 条例 国王诏书.docx \Atiitt 手写文字识别 讯飞科大 语音云.docx \Atitit 代码托管与虚拟主机.docx \Atitit 企业文化 每日心灵 鸡汤 值班 发布.docx \Atitit 几大研发体系对比 Stage-Gat
Atitit s2018.2 s2 doc list on home ntpc.docx \Atiitt uke制度体系 法律 法规 规章 条例 国王诏书.docx \Atiitt 手写文字识别 ...
随机推荐
- jQuery基础_3
DOM:文档处理内部插入:父子级关系$("a").append($("b"))把b插入到a中[a里面的后面]$("b").appendTo( ...
- 解决Web部署 svg/woff/woff2字体 404错误
在IIS上部署web项目的时候,发现浏览器报找不到woff.woff2字体的错误,导致浏览器加载字体报404错误,由于服务器IIS不认SVG,WOFF/WOFF2 这几个文件类型,只要在IIS上添加M ...
- c#对数据库访问完应关闭连接
1.对数据库的连接SqlConnection con = new SqlConnection(constr);使用完成后,应该至少应该close或dispose关闭.否则会导致数据库例如(SQl200 ...
- 【转载】Android数据存储之SQLite
SQLite是D.Richard Hipp用C语言编写的开源嵌入式数据库引擎.它支持大多数的SQL92标准,并且可以在所有主要的操作系统上运行. 在Android中创建的SQLite数据库存储在:/d ...
- SVN修改用户名与密码
由于在svn的界面中并没有为我们提供直接更换用户名密码的地方,所以一旦我们需要更换用户名的就需要自己想一些办法. 解决方案如下: 在Eclipse使用SVN的过程中大多数人往往习惯把访问SVN的用户名 ...
- CentOS访问Windows共享文件夹的方法
CentOS访问Windows共享文件夹的方法 1 在地址栏中输入下面内容: smb://Windows IP/Share folder name,smb为Server Message Block协议 ...
- [UCSD白板题] Sorting: 3-Way Partition
Problem Introduction The goal in this problem is to redesign a given implementation of the randomize ...
- To Use FTP Command in Linux
Yesterday I was asked to upload a file in Linux to the corresponding server. I said "oops" ...
- Object-C中代码如何分离接口和实现
使用C#习惯了代码的布局为:public (interface,class with static memebers),internal (class with implementation). 比如 ...
- oracle中imp命令详解 .
转自http://www.cnblogs.com/songdavid/articles/2435439.html oracle中imp命令详解 Oracle的导入实用程序(Import utility ...