zoukankan      html  css  js  c++  java
  • 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    20161116日  下午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    20161116日  下午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    2016119日  下午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    20161116日  下午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://blog.csdn.net/attilax

    Atiend

     


  • 相关阅读:
    Effective C++:条款14:在中小企业资源管理copying表现
    Linux在iptables教程基本应用防火墙
    C++内存分配和拷贝构造函数写研究
    Codeforces 479E Riding in a Lift(dp)
    Swift
    Swift
    Swift
    Swift
    Swift
    Swift
  • 原文地址:https://www.cnblogs.com/attilax/p/15198287.html
Copyright © 2011-2022 走看看