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 手写文字识别 ...
随机推荐
- (完全背包 大数)Dollar Dayz (POJ 3181)
http://poj.org/problem?id=3181 Description Farmer John goes to Dollar Days at The Cow Store and disc ...
- libev安装与示例程序编译运行
Linux平台C网络编程,之前总是看各大名著(如UNIX环境高级编程和UNIX网络编程,还有TCP/IP详解 卷1:协议和深入理解计算机系统(原书第2版)),同时写点小程序练习.然而还是拿不出手. 参 ...
- bash和Bourne_shell的区别
Linux 中的 shell 有很多类型,其中最常用的几种是: Bourne shell (sh).C shell (csh) 和 Korn shell (ksh), 各有优缺点.Bourne she ...
- E9相关技术链接
1.飞思卡尔i.MX6q安装ubuntu14.04操作系统:http://demo.netfoucs.com/bzw073/article/details/42551399 2. DS-5社区版安装: ...
- testng参数化(提供测试数据)【转】
testng提供测试数据的两个注释:@DataProvide和@Parameter 一.通过testng.xml中设置参数 (实际上testng.xml只是一个名字,可以起任何一个名字,只要是.x ...
- TextView支持的XML属性及相关方法
1.android:auyoLink----->setAutoLinkMask(int) ----->是否将符合指定格式的文字转换为可单击的超链接形式 2.android:autoText ...
- bat运行时不弹出那个黑框框的完美解决方案
批处理文件运行时经常出现讨厌的黑框,以下的方法,即可以解决 保存为run.vbs运行即可: set ws = createobject("wscript.shell") ws. ...
- 基于ejbca构建独立ca系统
ejbca,是一个CA(Certificate Authority)系统软件,CA是数字证书认证中心的简称,主要功能是管理数字证书,包括证书的颁发.销毁.更新等,ejbca实现了CA规范,因此可以用来 ...
- 使用开源库MAGICODES.WECHAT.SDK进行微信公众号支付开发
概要 博客使用Word发博,发布后,排版会出现很多问题,敬请谅解.可加群获取原始文档. 本篇主要讲解微信支付的开发流程,相关业务基于MAGICODES.WECHAT.SDK实现.通过本篇教程,您可以很 ...
- ORM查询语言(OQL)简介--高级篇(续):庐山真貌
相关文章内容索引: ORM查询语言(OQL)简介--概念篇 ORM查询语言(OQL)简介--实例篇 ORM查询语言(OQL)简介--高级篇:脱胎换骨 ORM查询语言(OQL)简介--高级篇(续):庐山 ...