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 图像扫描器---基于扫描线的更多相关文章

  1. Atitit 图像金字塔原理与概率 attilax的理解总结qb23

    Atitit 图像金字塔原理与概率 attilax的理解总结qb23 1.1. 高斯金字塔  (  Gaussianpyramid): 拉普拉斯金字塔 (Laplacianpyramid):1 1.2 ...

  2. Atitit 图像清晰度 模糊度 检测 识别 评价算法 源码实现attilax总结

    Atitit 图像清晰度 模糊度 检测 识别 评价算法 源码实现attilax总结 1.1. 原理,主要使用像素模糊后的差别会变小1 1.2. 具体流程1 1.3. 提升性能 可以使用采样法即可..1 ...

  3. Atitit 图像清晰度 模糊度 检测 识别 评价算法 原理

    Atitit 图像清晰度 模糊度 检测 识别 评价算法 原理 1.1. 图像边缘一般都是通过对图像进行梯度运算来实现的1 1.2. Remark: 1 1.3.  1.失焦检测. 衡量画面模糊的主要方 ...

  4. Atitit.prototype-base class-based  基于“类” vs 基于“原型”

    Atitit.prototype-base class-based  基于“类” vs 基于“原型” 1. 基于“类” vs 基于“原型”1 2.  对象的产生有两种基本方式.一种是以原型(proto ...

  5. 图像切割—基于图的图像切割(Graph-Based Image Segmentation)

     图像切割-基于图的图像切割(Graph-Based Image Segmentation) Reference: Efficient Graph-Based Image Segmentation ...

  6. 基于稀疏表示的图像超分辨率《Image Super-Resolution Via Sparse Representation》

    由于最近正在做图像超分辨重建方面的研究,有幸看到了杨建超老师和马毅老师等大牛于2010年发表的一篇关于图像超分辨率的经典论文<ImageSuper-Resolution Via Sparse R ...

  7. 基于传统方法点云分割以及PCL中分割模块

      之前在微信公众号中更新了以下几个章节 1,如何学习PCL以及一些基础的知识 2,PCL中IO口以及common模块的介绍 3,PCL中常用的两种数据结构KDtree以及Octree树的介绍    ...

  8. 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 ...

  9. 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 手写文字识别   ...

随机推荐

  1. XML增、删、改

    今天有个需求需要操作xml节点.突然见遗忘了许多.上网看了些资料.才整出来.脑袋真不够用.在这里把我找到的资料共享一下.方便以后使用.本文属于网摘/ 一.简单介绍 using System.Xml; ...

  2. Python :open文件操作,配合read()使用!

    python:open/文件操作 open/文件操作f=open('/tmp/hello','w') #open(路径+文件名,读写模式) 如何打开文件 handle=open(file_name,a ...

  3. ARP包分析(wireshark)

    ARP数据报格式(42字节) 这是用wireshark抓到的一个ARP包,42个字节. 这个ARP包的 以太网首部(14字节): 字段               长度(Byte)           ...

  4. <Oracle Database>后台进程

    进程监视器进程(PMON)  这个进程负责在出现异常中止的连接之后完成清理.PMON会回滚未提交的工作,并释放为失败进程分配的SGA资源.PMON还负责监视其他的Oracle后台进程,并在必要时(如果 ...

  5. shell 记录

    查看进程打开的文件句柄lsof -p 进程号|wc -l date --set "Wed Dec 11 14:51:41 CST 2013" 重启VPN pon vpn arg=` ...

  6. Python学习之路--select解析

    sellect.poll.epoll三者的区别 select select最早于1983年出现在4.2BSD中,它通过一个select()系统调用来监视多个文件描述符的数组,当select()返回后, ...

  7. 深入分析PHP优化及注意事项

    深入分析PHP优化及注意事项 1.尽量静态化: 如果一个方法能被静态,那就声明它为静态的,速度可提高1/4,甚至我测试的时候,这个提高了近三倍. 当然了,这个测试方法需要在十万级以上次执行,效果才明显 ...

  8. 条件随机场理论分析CRF(Conditional Random Field)

  9. jdbc 4.0新特性

    来自网络 在 Java SE 6 所提供的诸多新特性和改进中,值得一提的是为 Java 程序提供数据库访问机制的 JDBC 版本升级到了 4.0, 这个以 JSR-221 为代号的版本 , 提供了更加 ...

  10. [转]全面理解Unity加载和内存管理

    [转]全面理解Unity加载和内存管理 最近一直在和这些内容纠缠,把心得和大家共享一下: Unity里有两种动态加载机制:一是Resources.Load,一是通过AssetBundle,其实两者本质 ...