python 基于opencv去除圖片陰影
如果你自己打印過東西,應(yīng)該有過這種經(jīng)歷。如果用自己拍的圖片,在手機(jī)上看感覺還是清晰可見,但是一打印出來就是漆黑一片。比如下面這兩張圖片:

因?yàn)樽筮叺膱D片有大片陰影,所以打印出來的圖片不堪入目(因?yàn)榇蛴∫?毛錢,所以第二張圖片只是我用程序模擬的效果)。
那有什么辦法可以解決嗎?答案是肯定的,今天我們就來探討幾個(gè)去除陰影的方法。
二、如何去除陰影?首先為了方便處理,我們通常會(huì)對(duì)圖片進(jìn)行灰度轉(zhuǎn)換(即將圖片轉(zhuǎn)換成只有一個(gè)圖層的灰色圖像)。
然后我們分析一下,在上面的圖片中有三個(gè)主色調(diào),分別是字體顏色(黑色)、紙張顏色(偏白)、陰影顏色(灰色)。知道這點(diǎn)后我們就好辦了。我們只需要把灰色和白色部分都處理為白色就好了。
那要我怎么才知道白色和灰色區(qū)域呢?對(duì)于一個(gè)8位的灰度圖,黑色部分的像素大致在0-30左右。白色和灰色應(yīng)該在31-255左右(這個(gè)范圍只是大致估計(jì),實(shí)際情況需要看圖片)。如圖:

左邊是原圖,右邊是處理后的圖片。我們將灰色和接近白色的部分都處理成了白色。
那下面我們就開始處理吧。
三、numpy的ndarray數(shù)組可能有些讀者沒有接觸過numpy,這里簡(jiǎn)單說一下。
numpy是一個(gè)第三方的模塊,用它我們可以很方便的處理多維數(shù)組(ndarray數(shù)組)。而圖片在OpenCV中的存儲(chǔ)方式正好是ndarray,所以我們對(duì)數(shù)組的操作就是對(duì)圖片的操作。
在使用之前我們需要安裝一下OpenCV模塊:
pip install opencv-python
在安裝OpenCV時(shí)會(huì)自動(dòng)安裝numpy。
下面我們主要是看看布爾索引的操作,先看下面代碼:
import numpy as np# 創(chuàng)建一個(gè)元素為1, 0, 1, 1的ndarray數(shù)組arr = np.array([1, 0, 1, 1])# 判斷數(shù)組中有沒有0res = arr == 0# 將數(shù)組中為0的元素賦值為10arr[res] = 10
如果沒有接觸過numpy會(huì)不太理解上面的語法。我們來詳細(xì)說一下:
1.創(chuàng)建ndarray數(shù)組:我們通過np.array可以將現(xiàn)有的列表轉(zhuǎn)換成一個(gè)ndarray對(duì)象,這個(gè)很好理解
2.判斷數(shù)組中有沒有0:我們可以直接用ndarray對(duì)象來判斷,比如:arr == 0,他會(huì)返回一個(gè)元素結(jié)構(gòu)和數(shù)量一樣的ndarray對(duì)象。但是返回的對(duì)象原始類型是bool,我們來看看res的輸出:
[False True False False]
從結(jié)果可以看出,我們比較arr==0就是對(duì)數(shù)組中每個(gè)元素進(jìn)行比較,并返回比較的布爾值。
3.將數(shù)組中為0的元素賦值為10:而最難理解的arr[res]操作。它其實(shí)就是拿到res中為True的視圖,比如上面的結(jié)果是第二個(gè)為True則只會(huì)返回第二個(gè)元素的視圖。我們執(zhí)行下面的代碼:
arr[res] = 10
就是把對(duì)應(yīng)res為True的部分賦值為10,也就是將arr中值為0的部分賦值為10。
下面是arr最后的結(jié)果:
[ 1 10 1 1]
可以看到原本的0處理為了10。
四、去除陰影現(xiàn)在我們知道了布爾索引,我們可以對(duì)圖片進(jìn)行處理了。我們只需要讀取圖片,然后將像素值大于30的部分處理為白色就好了。下面是我們的代碼:
import cv2# 讀取圖片img = cv2.imread(’page.jpg’, 0)# 將像素值大于30的部分修改為255(白色)img[img > 30] = 255# 保存修改后的圖片cv2.imwrite(’res.jpg’, img)
上面的代碼非常簡(jiǎn)單,我們使用cv2.imread函數(shù)讀取圖片,第一個(gè)參數(shù)是圖片路徑,第二個(gè)參數(shù)表示讀取為灰度圖。我們來看看效果圖:

可以看到陰影部分被很好地去除了。有些字比較模糊,我們可以通過調(diào)節(jié)灰白色的范圍調(diào)整。比如:
img[img > 40] = 255
具體的值就要根據(jù)要處理的圖片來決定了。
五、改進(jìn)對(duì)于上面的處理,還可以做一個(gè)小小的改進(jìn)。我們可以讓紙張顏色不那么白,我們來看改進(jìn)后的代碼:
import cv2import numpy as npimg = cv2.
相關(guān)文章:
1. ASP基礎(chǔ)知識(shí)VBScript基本元素講解2. ASP.NET MVC使用jQuery ui的progressbar實(shí)現(xiàn)進(jìn)度條3. Python 合并拼接字符串的方法4. Linux刪除系統(tǒng)自帶版本Python過程詳解5. Python3 json模塊之編碼解碼方法講解6. python 使用事件對(duì)象asyncio.Event來同步協(xié)程的操作7. Python sublime安裝及配置過程詳解8. Python 利用Entrez庫篩選下載PubMed文獻(xiàn)摘要的示例9. Python 制作查詢商品歷史價(jià)格的小工具10. Python插件機(jī)制實(shí)現(xiàn)詳解

網(wǎng)公網(wǎng)安備