Java基于opencv實(shí)現(xiàn)圖像數(shù)字識(shí)別(四)—圖像降噪

Java基于opencv實(shí)現(xiàn)圖像數(shù)字識(shí)別(四)—圖像降噪

我們每一步的工作都是基于前一步的,我們先把我們前面的幾個(gè)函數(shù)封裝成一個(gè)工具類段多,以后我們所有的函數(shù)都基于這個(gè)工具類

這個(gè)工具類呢轮傍,就一個(gè)成員變量Mat,非常的簡(jiǎn)單氓栈,這里給出代碼

public class ImageUtils {
    private static final int BLACK = 0;
    private static final int WHITE = 255;

    private Mat mat;

    /**
     * 空參構(gòu)造函數(shù)
     */
    public ImageUtils() {

    }

    /**
     * 通過(guò)圖像路徑創(chuàng)建一個(gè)mat矩陣
     * 
     * @param imgFilePath
     *            圖像路徑
     */
    public ImageUtils(String imgFilePath) {
        mat = Imgcodecs.imread(imgFilePath);
    }

    public void ImageUtils(Mat mat) {
        this.mat = mat;
    }

    /**
     * 加載圖片
     * 
     * @param imgFilePath
     */
    public void loadImg(String imgFilePath) {
        mat = Imgcodecs.imread(imgFilePath);
    }

    /**
     * 獲取圖片高度的函數(shù)
     * 
     * @return
     */
    public int getHeight() {
        return mat.rows();
    }

    /**
     * 獲取圖片寬度的函數(shù)
     * 
     * @return
     */
    public int getWidth() {
        return mat.cols();
    }

    /**
     * 獲取圖片像素點(diǎn)的函數(shù)
     * 
     * @param y
     * @param x
     * @return
     */
    public int getPixel(int y, int x) {
        // 我們處理的是單通道灰度圖
        return (int) mat.get(y, x)[0];
    }

    /**
     * 設(shè)置圖片像素點(diǎn)的函數(shù)
     * 
     * @param y
     * @param x
     * @param color
     */
    public void setPixel(int y, int x, int color) {
        // 我們處理的是單通道灰度圖
        mat.put(y, x, color);
    }

    /**
     * 保存圖片的函數(shù)
     * 
     * @param filename
     * @return
     */
    public boolean saveImg(String filename) {
        return Imgcodecs.imwrite(filename, mat);
    }
}

灰度化和二值化的代碼我沒(méi)有貼出來(lái)彬犯,因?yàn)榇a實(shí)在有點(diǎn)長(zhǎng)

我們接著上一步的成果,來(lái)開(kāi)始我們的降噪

一田炭、8鄰域降噪

我感覺(jué)9宮格降噪更形象一點(diǎn)师抄;即9宮格中心被異色包圍,則同化


8鄰域降噪

降噪效果還是蠻好的教硫,這個(gè)方法對(duì)小噪點(diǎn)比較好

/**
     * 8鄰域降噪,又有點(diǎn)像9宮格降噪;即如果9宮格中心被異色包圍叨吮,則同化
     * @param pNum 默認(rèn)值為1
     */
    public void navieRemoveNoise(int pNum) {
        int i, j, m, n, nValue, nCount;
        int nWidth = getWidth(), nHeight = getHeight();

        // 對(duì)圖像的邊緣進(jìn)行預(yù)處理
        for (i = 0; i < nWidth; ++i) {
            setPixel(i, 0, WHITE);
            setPixel(i, nHeight - 1, WHITE);
        }

        for (i = 0; i < nHeight; ++i) {
            setPixel(0, i, WHITE);
            setPixel(nWidth - 1, i, WHITE);
        }

        // 如果一個(gè)點(diǎn)的周?chē)际前咨模_是黑色的瞬矩,刪除它
        for (j = 1; j < nHeight - 1; ++j) {
            for (i = 1; i < nWidth - 1; ++i) {
                nValue = getPixel(j, i);
                if (nValue == 0) {
                    nCount = 0;
                    // 比較以(j ,i)為中心的9宮格茶鉴,如果周?chē)际前咨模?                    for (m = j - 1; m <= j + 1; ++m) {
                        for (n = i - 1; n <= i + 1; ++n) {
                            if (getPixel(m, n) == 0) {
                                nCount++;
                            }
                        }
                    }
                    if (nCount <= pNum) {
                        // 周?chē)谏c(diǎn)的個(gè)數(shù)小于閥值pNum,把該點(diǎn)設(shè)置白色
                        setPixel(j, i, WHITE);
                    }
                } else {
                    nCount = 0;
                    // 比較以(j ,i)為中心的9宮格景用,如果周?chē)际呛谏暮#?                    for (m = j - 1; m <= j + 1; ++m) {
                        for (n = i - 1; n <= i + 1; ++n) {
                            if (getPixel(m, n) == 0) {
                                nCount++;
                            }
                        }
                    }
                    if (nCount >= 7) {
                        // 周?chē)谏c(diǎn)的個(gè)數(shù)大于等于7,把該點(diǎn)設(shè)置黑色;即周?chē)际呛谏?                        setPixel(j, i, BLACK);
                    }
                }
            }
        }

    }

二、連通域降噪
floodFill函數(shù)

我們先介紹一個(gè)函數(shù)(floodFill)

floodFill就是把一個(gè)點(diǎn)x的所有相鄰的點(diǎn)都涂上x(chóng)點(diǎn)的顏色伞插,一直填充下去割粮,直到這個(gè)區(qū)域內(nèi)所有的點(diǎn)都被填充完為止

在計(jì)算的過(guò)程中,每掃描到一個(gè)黑色(灰度值為0)的點(diǎn)媚污,就將與該點(diǎn)連通的所有點(diǎn)的灰度值都改為1舀瓢,因此這一個(gè)連通域的點(diǎn)都不會(huì)再次重復(fù)計(jì)算了。下一個(gè)灰度值為0的點(diǎn)所有連通點(diǎn)的顏色都改為2耗美,這樣依次遞加京髓,直到所有的點(diǎn)都掃描完。接下來(lái)再次掃描所有的點(diǎn)商架,統(tǒng)計(jì)每一個(gè)灰度值對(duì)應(yīng)的點(diǎn)的個(gè)數(shù)堰怨,每一個(gè)灰度值的點(diǎn)的個(gè)數(shù)對(duì)應(yīng)該連通域的大小,并且不同連通域由于灰度值不同甸私,因此每個(gè)點(diǎn)只計(jì)算一次诚些,不會(huì)重復(fù)飞傀。這樣一來(lái)就統(tǒng)計(jì)到了每個(gè)連通域的大小皇型,再根據(jù)預(yù)設(shè)的閥值,如果該連通域大小小于閥值砸烦,則其就為噪點(diǎn)弃鸦。這個(gè)算法比較適合檢查大的噪點(diǎn),與上個(gè)算法正好相反幢痘。

連通域降噪

因?yàn)槲艺业膱D像關(guān)系唬格,效果可能不咋明顯;

/**
     * 連通域降噪
     * @param pArea 默認(rèn)值為1
     */
    public void contoursRemoveNoise(double pArea) {
        int i, j, color = 1;
        int nWidth = getWidth(), nHeight = getHeight();

        for (i = 0; i < nWidth; ++i) {
            for (j = 0; j < nHeight; ++j) {
                if (getPixel(j, i) == BLACK) {
                    //用不同顏色填充連接區(qū)域中的每個(gè)黑色點(diǎn)
                    //floodFill就是把一個(gè)點(diǎn)x的所有相鄰的點(diǎn)都涂上x(chóng)點(diǎn)的顏色,一直填充下去购岗,直到這個(gè)區(qū)域內(nèi)所有的點(diǎn)都被填充完為止
                    Imgproc.floodFill(mat, new Mat(), new Point(i, j), new Scalar(color));
                    color++;
                }
            }
        }
        
        //統(tǒng)計(jì)不同顏色點(diǎn)的個(gè)數(shù)
        int[] ColorCount = new int[255];

        for (i = 0; i < nWidth; ++i) {
            for (j = 0; j < nHeight; ++j) {
                if (getPixel(j, i) != 255) {
                    ColorCount[getPixel(j, i) - 1]++;
                }
            }
        }
        
        //去除噪點(diǎn)
        for (i = 0; i < nWidth; ++i) {
            for (j = 0; j < nHeight; ++j) {

                if (ColorCount[getPixel(j, i) - 1] <= pArea) {
                    setPixel(j, i, WHITE);
                }
            }
        }

        for (i = 0; i < nWidth; ++i) {
            for (j = 0; j < nHeight; ++j) {
                if (getPixel(j, i) < WHITE) {
                    setPixel(j, i, BLACK);
                }
            }
        }

    }

注:
本文章參考了很多博客汰聋,感謝;主要是跟著一個(gè)博客來(lái)實(shí)現(xiàn)的https://blog.csdn.net/ysc6688/article/category/2913009(也是基于opencv來(lái)做的喊积,只不過(guò)他是用c++實(shí)現(xiàn)的)感謝

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末烹困,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子乾吻,更是在濱河造成了極大的恐慌髓梅,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绎签,死亡現(xiàn)場(chǎng)離奇詭異枯饿,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)诡必,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)奢方,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人擒权,你說(shuō)我怎么就攤上這事袱巨。” “怎么了碳抄?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵愉老,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我剖效,道長(zhǎng)嫉入,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任璧尸,我火速辦了婚禮咒林,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘爷光。我一直安慰自己垫竞,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布蛀序。 她就那樣靜靜地躺著欢瞪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪徐裸。 梳的紋絲不亂的頭發(fā)上遣鼓,一...
    開(kāi)封第一講書(shū)人閱讀 49,071評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音重贺,去河邊找鬼骑祟。 笑死回懦,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的次企。 我是一名探鬼主播怯晕,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼缸棵!你這毒婦竟也來(lái)了贫贝?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蛉谜,失蹤者是張志新(化名)和其女友劉穎稚晚,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體型诚,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡客燕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了狰贯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片也搓。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖涵紊,靈堂內(nèi)的尸體忽然破棺而出傍妒,到底是詐尸還是另有隱情,我是刑警寧澤摸柄,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布颤练,位于F島的核電站,受9級(jí)特大地震影響驱负,放射性物質(zhì)發(fā)生泄漏嗦玖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一跃脊、第九天 我趴在偏房一處隱蔽的房頂上張望宇挫。 院中可真熱鬧,春花似錦酪术、人聲如沸器瘪。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)橡疼。三九已至,卻和暖如春咧七,著一層夾襖步出監(jiān)牢的瞬間衰齐,已是汗流浹背任斋。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工继阻, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留耻涛,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓瘟檩,卻偏偏與公主長(zhǎng)得像抹缕,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子墨辛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容