2016-06-22 165 views
0

刪除灰色背景我寫了一個小的Java理智客戶端的Windows使用jfreesane庫和它的工作好了一段時間,但是昨天我發現掃描儀佳能CanoScan立德問題60 - 當使用「灰度「模式掃描圖像灰色背景,我不知道如何擺脫它。這裏就是我說的:如何從掃描圖像

enter image description here

我就遇到了這個問題,其他一些掃描儀和通過調整對比參數解決了這個問題,但是佳能CanoScan立德60沒有之一。下面是從「scanimage -A」選項輸出(我試過所有涉及到的顏色除了伽馬錶)的完整列表:

All options specific to device `genesys:libusb:003:002': 
    Scan Mode: 
    --mode Color|Gray|Lineart [Gray] 
     Selects the scan mode (e.g., lineart, monochrome, or color). 
    --source Flatbed|Transparency Adapter [inactive] 
     Selects the scan source (such as a document-feeder). 
    --preview[=(yes|no)] [no] 
     Request a preview-quality scan. 
    --depth 8|16 [8] 
     Number of bits per sample, typical values are 1 for "line-art" and 8 
     for multibit scans. 
    --resolution 1200|600|300|150|75dpi [75] 
     Sets the resolution of the scanned image. 
    Geometry: 
    -l 0..218mm [0] 
     Top-left x position of scan area. 
    -t 0..299mm [0] 
     Top-left y position of scan area. 
    -x 0..218mm [218] 
     Width of scan-area. 
    -y 0..299mm [299] 
     Height of scan-area. 
    Enhancement: 
    --custom-gamma[=(yes|no)] [no] 
     Determines whether a builtin or a custom gamma-table should be used. 
    --gamma-table 0..65535,... [inactive] 
     Gamma-correction table. In color mode this option equally affects the 
     red, green, and blue channels simultaneously (i.e., it is an intensity 
     gamma table). 
    --red-gamma-table 0..65535,... [inactive] 
     Gamma-correction table for the red band. 
    --green-gamma-table 0..65535,... [inactive] 
     Gamma-correction table for the green band. 
    --blue-gamma-table 0..65535,... [inactive] 
     Gamma-correction table for the blue band. 
    --swdeskew[=(yes|no)] [no] 
     Request backend to rotate skewed pages digitally 
    --swcrop[=(yes|no)] [no] 
     Request backend to remove border from pages digitally 
    --swdespeck[=(yes|no)] [no] 
     Request backend to remove lone dots digitally 
    --despeck 1..9 (in steps of 1) [1] 
     Maximum diameter of lone dots to remove from scan 
    --swskip 0..100% (in steps of 1) [0] 
     Request driver to discard pages with low numbers of dark pixels 
    --swderotate[=(yes|no)] [no] 
     Request driver to detect and correct 90 degree image rotation 
    Extras: 
    --lamp-off-time 0..60 [15] 
     The lamp will be turned off after the given time (in minutes). A value 
     of 0 means, that the lamp won't be turned off. 
    --lamp-off-scan[=(yes|no)] [no] 
     The lamp will be turned off during scan. 
    --threshold 0..100% (in steps of 1) [50] 
     Select minimum-brightness to get a white point 
    --threshold-curve 0..127 (in steps of 1) [50] 
     Dynamic threshold curve, from light to dark, normally 50-65 
    --disable-dynamic-lineart[=(yes|no)] [no] 
     Disable use of a software adaptive algorithm to generate lineart 
     relying instead on hardware lineart. 
    --disable-interpolation[=(yes|no)] [no] 
     When using high resolutions where the horizontal resolution is smaller 
     than the vertical resolution this disables horizontal interpolation. 
    --color-filter Red|Green|Blue|None [None] 
     When using gray or lineart this option selects the used color. 
    Sensors: 
    Buttons: 
    --clear-calibration 
     Clear calibration cache 

這裏還有一個有趣的事情:簡單的掃描( Linux的掃描程序)還是設法從圖像與此掃描儀中取出灰色:

enter image description here

我不知道,如果它使用了一些後掃描處理,或者如果它知道如何分辨掃描儀關於對比。如果它是前者,是否有任何Java庫可以消除這種灰色噪音?

+0

我懷疑簡單的掃描使用後期處理,只是二值化圖像。那就是:設置一個閾值,任何灰度值> t設置爲255的像素,否則設置爲0.您確實嘗試了線性模式,不是嗎? – Fildor

+0

@Fildor是的,我嘗試使用不同的閾值進行線條劃分,但結果非常糟糕:圖像上的黑點和污點以及字母變得「尖銳」。 –

+0

在藝術線條模式下,您是否嘗試使用去斑處理? (--swdespeck和--despeck) – Fildor

回答

0

一些測試,我也結束了此功能(對比度公式從here取)後:

public void processImage(BufferedImage bimg, int brightness, int contrast, int t_black, int t_white) { 
     Color c; 
     int r, g, b; 
     float factor = (259f * (contrast + 255f))/(255f * (259f - contrast)); 

     for (int x = 0; x < bimg.getWidth(); x++) 
      for (int y = 0; y < bimg.getHeight(); y++) { 
       c = new Color(bimg.getRGB(x, y)); 
       // apply brightness and contrast 
       r = Math.round(factor * (c.getRed() - 128) + 128) + brightness; 
       g = Math.round(factor * (c.getGreen() - 128) + 128) + brightness; 
       b = Math.round(factor * (c.getBlue() - 128) + 128) + brightness; 
       // limit to [0, 255] range 
       r = Math.min(255, Math.max(0, r)); 
       g = Math.min(255, Math.max(0, g)); 
       b = Math.min(255, Math.max(0, b)); 
       // apply black and white thresholds 
       if (r < t_black && g < t_black && b < t_black) 
        bimg.setRGB(x, y, 0); 
       else if (r > t_white && g > t_white && b > t_white) 
        bimg.setRGB(x, y, 255 << 16 | 255 << 8 | 255); 
       else 
        bimg.setRGB(x, y, r << 16 | g << 8 | b); 
      } 
    }