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 手写文字识别 ...
随机推荐
- 启动maven项目发现没有tomcat
手动配置tomcat插件 1.在项目打开之前,选择configure--->plugins 2.搜索"tomcat",勾选,ok 3.再选择configure--->s ...
- 使用zabbix邮件发送报表
简介 首先我们来看下图片的url (右击screens中随便一张图片,选复制图片地址) http://zabbix.xxx.com/chart2.php?graphid=524&screeni ...
- C# 部分语法总结(入门经典)
class Program { static void Main(string[] args) { init(); System.Console.ReadKey(); } #region 接口 /// ...
- 使用JSON Schema来验证接口数据
最近在做一些关于JSON Schema的基建,JSON Schema可以描述一个JSON结构,那么反过来他也可以来验证一个JSON是否符合期望的格式. 如果之前看我写的<使用joi来验证数据模型 ...
- win7挂载NFS
以下是在win7旗舰版下挂载NFS服务的步骤: 1 打开NFS服务 控制面板-->程序-->打开程序和功能-->NFS服务
- DVDstore 数据库基准测试
1 DVDStore介绍 DVDstore 是一个电子商务测试应用,模拟多用户登陆在线系统,搜索DVD,购买DVD.多用来用作测试数据库性能或者其他的压力测试. 2 快速浏览测试步骤 (a) 安装数 ...
- DIY操作系统(一)
先说几句题外话: 回想第一次看到<30天自制操作系统>这本书时,就被这快餐般的标题深深吸引了,我无法想象如此复杂有内涵的内容能在30天就弄出来,直到我花了一个多月看到这本书的第9天时,我放 ...
- 7.4 MVC vs MVP
MVC(Model_view_contraller)"模型_视图_控制器". MVC应用程序总是由这三个部分组成.Event(事件)导致Controller改变Model或View ...
- [Leetcode]Palindrome Number
Determine whether an integer is a palindrome. Do this without extra space. 这题貌似解法挺多,直接用简单的把数倒置,没有考虑数 ...
- 【C++自绘控件】如何用GDI+来显示图片
在我们制作一个应用软件的时候往往需要在窗口或控件中添加背景图.而图片不仅有BMP格式的,还有JPEG.PNG.TIFF.GIF等其它的格式.那么如何用jpg格式的图片来当背景呢? 这里用到了GDI+, ...