導(dǎo)讀
在做OCR票據(jù)類識別的時候經(jīng)常會遇到一些票據(jù)上會有印章,而對于的文字檢測和文字識別模型而言,印章的存在一定會影響模型識別的準(zhǔn)確率,所以通常我們都是先將圖片去除印章之后,再將圖片送入到文字檢測和文字識別模型中。
本篇文章就介紹一個比較簡單的方法用來去除紅色印章
移除紅色印章
我們通過分離圖片的通道,提取圖片的紅色通道,然后再通過閾值來去除紅色的印章
import cv2
import numpy as np
def remove_red_seal(input_img):
# 分離圖片的通道
blue_c, green_c, red_c = cv2.split(input_img)
#利用大津法自動選擇閾值
thresh, ret = cv2.threshold(red_c, 0, 255,cv2.THRESH_OTSU)
#對閾值進(jìn)行調(diào)整
filter_condition = int(thresh * 0.90)
#移除紅色的印章
_, red_thresh = cv2.threshold(red_c, filter_condition, 255, cv2.THRESH_BINARY)
# 把圖片轉(zhuǎn)回3通道

result_img = np.expand_dims(red_thresh, axis=2)
result_img = np.concatenate((result_img, result_img, result_img), axis=-1)
return result_img
input_img = cv2.imread("1.jpg")
remove_seal = remove_red_seal(input_img)
cv2.imwrite("remove_seal.jpg",remove_seal)
去除印章前
去除印章后
注意:對于不同的場景,你可能需要對閾值進(jìn)行微調(diào)(百分比),以獲取你認(rèn)為的最佳閾值,百分比越小紅色印章移除的越干凈,同時也有可能會移除部分文字信息。
函數(shù)
(src, thresh, maxval, type[, dst])->ret,dst
這里重點(diǎn)介紹一下type參數(shù)的取值,它的取值如下圖所示
在對圖片做二值化處理的時候需要設(shè)置一個閾值來對圖片進(jìn)行二值化處理,然而在部分復(fù)雜的場景下,如果采用固定的閾值可能在某些場景下效果不錯,換到有些場景時效果就不行了。
這時候我們就會想要用自動的閾值,這時候就可以用到和這兩個參數(shù),它們會根據(jù)圖片的灰度直方圖來計(jì)算出一個閾值將圖片分為前景和背景,下面我們來介紹一下它們是如何實(shí)現(xiàn)的。
大津法(OTSU):也被稱為是最大類間差法,被認(rèn)為是圖像分割閾值選擇的最佳算法,計(jì)算簡單,魯棒性較好,不受圖像亮度和和對比度的影響,因此在數(shù)字圖像處理中被廣泛的使用。
它根據(jù)圖像的灰度直方圖,將圖像分為前景和背景兩個部分。因?yàn)榉讲钍嵌攘繄D像灰度分布是否均勻,如果圖像的背景和前景之間的差別越大,那么它們之間的類間方差差距也會越大。所以,如果我們能夠保證圖像前景和背景的灰度直方圖方差差距最大時,就能讓前景和背景分離的效果達(dá)到最佳,實(shí)際效果還是取決于具體的場景,可能需要根據(jù)不同的需求對閾值進(jìn)行微調(diào)。
其實(shí)只要抓住大津法的核心思想最大化前景和背景的方差要推導(dǎo)公式用代碼來實(shí)現(xiàn)并不難,接下來我們來推導(dǎo)一下這個公式。
假設(shè)灰度T是圖像分割前景和背景的最佳閾值,圖像上任意一點(diǎn)屬于前景的概率為ω1,屬于背景的概率為ω2。圖像前景的平均灰度值為μ1?,背景的平均灰度值為μ2?,所以圖像的平均灰度值μ為
根據(jù)類間的方差計(jì)算公式,前景和背景的類間方差計(jì)算如下
因?yàn)?/p>
結(jié)合上面3個式子可得
為了方便我們后面編程來實(shí)現(xiàn),還需要對上式做一些調(diào)整,這里引入幾個參數(shù)pi表示灰度值等于i的概率,圖像的灰度取值在[ 0 , 255 ] 范圍內(nèi)取整數(shù)。假設(shè)灰度值t可以使圖像前景和背景的方差最大,m1?為灰度級t tt的累加均值,m為圖像的灰度級L的均值累加
可得μ1和μ2
接下來我們對δ2 結(jié)合上面的式子做個變換
我們只需要使上式最大化即可
上面我們推導(dǎo)了大津法的公式,以及如何來求解閾值劃分前景和背景,下面我們用python來實(shí)現(xiàn)這個算法
大津法
比較一下我們自己實(shí)現(xiàn)的大津法和opencv內(nèi)置的函數(shù)
最終兩者輸出的閾值都是160,不過python實(shí)現(xiàn)的代碼是opencv時間的25倍左右,所以python在這方面對比c確實(shí)是硬傷。
三角法():是基于直方圖利用幾何的方法來求分割的最佳閾值,假設(shè)的成立條件是直方圖的最大波峰在靠近最亮的一側(cè),然后再通過三角形來求解最大的距離找到最佳閾值。
如圖所示,在灰度直方圖上,從最高峰bmax?到最暗對應(yīng)直方圖的bmin?構(gòu)造一條直線,然后從bmin ?到bmax?開始計(jì)算到直線的垂直距離d,當(dāng)d達(dá)到最大時,此時所對應(yīng)的灰度值t就是分割圖像的最佳閾值
接下來我們看看,使用三角法求解閾值值的整個流程,這里引入兩個參數(shù)灰度級L和頻率f:
將圖片轉(zhuǎn)換為灰度圖,通過OpenCV可以很容易實(shí)現(xiàn)計(jì)算灰度圖的灰度直方圖,也就是每個灰度級L對應(yīng)的頻率f 對灰度直方圖進(jìn)行排序,按灰度級進(jìn)行排序,由小到大確定直方圖最大值(也就是f)所對應(yīng)灰度級L的位置,如果在左側(cè)(灰度值小)就需要對灰度直方圖進(jìn)行翻轉(zhuǎn)根據(jù)左側(cè)邊界的灰度級點(diǎn)( Lmin , fmin)和最亮部分頻率最大對應(yīng)的灰度級點(diǎn)( Lmax , fmax) ,由兩點(diǎn)式我們可以確定這條直線計(jì)算Lmin?到Lmax?的任意一點(diǎn)(L, f )到直線的距離d,當(dāng)d最大時所對應(yīng)的L就是我們要求的最佳閾值
大津法和三角法的對比opencv顯示灰度直方圖
參考:
PS去除水印怎么完美去除圖片水印
打開SP軟件
第一步先打開我們需要除去水印的圖片,單擊左上方【文件】選擇【打開】然后選擇你要去水印的圖片,【打開】如下圖:
圖1:
極網(wǎng)設(shè)計(jì)PS去水印教程
圖2
極網(wǎng)設(shè)計(jì)自學(xué)教程PS去水印
圖3:
極網(wǎng)設(shè)計(jì)自學(xué)教程
打開之后頁面如下圖:
PS去除水印
第二步:
接著用上面同樣的方法打開另一個和要去掉的水印一樣的圖片,打開后如下圖:
PS去水印
PS去除水印
然后把鼠標(biāo)放在淘寶網(wǎng)這個圖片上如下圖:
單擊鼠標(biāo)左鍵按住不放,拖動到需要去除水印的圖片標(biāo)題上,接著拖放在圖片的水印位置重疊在同一個位置上。如下圖1 圖2圖3:
圖1:
圖2:
圖3:
然后選中背景圖層,拖往下面復(fù)制圖層圖標(biāo),復(fù)制出一個背景圖層副本,如下圖:
然后選中原背景圖層,點(diǎn)擊圖層前面的小眼睛,把它隱藏,如下圖:(目的是為了備份背景原圖預(yù)防操作失誤損壞原圖)
然后把 圖層1 拖到背景拷貝圖層下面,如下圖:
然后,單擊選中 背景拷貝圖層 在設(shè)置圖層混合模式那里選擇【差值】。如下圖1 圖2:
圖1
圖2:
這個時候頁面顯示效果如下圖:
接下來 選中圖層1 然后單擊下面設(shè)置圖層按鈕 選擇 【色階】如下圖1 圖2:
圖1
圖2:
接下來 如下圖1,調(diào)整色階右邊白色按扭 往左滑動,直到圖片中水印中的文字減淡到看不見為止,如圖2。
圖2:
接下來,選中背景拷貝圖層,然后點(diǎn)擊下面調(diào)整圖層按扭,選擇【色階】如下圖1,圖2
圖1:
圖2:
接下來,選中 圖層1 然后按住鍵盤上的【Ctrl】鍵 鼠標(biāo)左鍵單擊圖層1如下圖紅框位置,如下圖:
這個時候頁面變成了這個樣子如圖:
然后單擊工具欄上的【選擇】然后在彈出的對列表中選擇【反選】如下圖:
這個時候頁面變成了這個樣子如圖:
接下來 單擊選中 背景拷貝圖層的色階圖層中的矩形框。如下圖:
然后把前景色調(diào)成純黑色,單擊前面的正方形框,如下圖:
在彈出的對話框里選擇純黑色,然后點(diǎn)確定。如下圖:
然后,按Alt+Delete鍵組合,把選好的黑色填充進(jìn)去,變化如下圖:
然后單擊選擇 色階2圖層如下圖:
然后在色階面版如下圖,把色階白色按扭往左邊滑動,直到圖片上的水印消失到理想狀態(tài)。
到此已成功去除水印,如下圖效果。