先來看看今天的結果gif
-> 此篇文章的程式碼 github Day24_自製文件掃描機_photo_scanner.ipynb
前言我們該來運用之前學過的所有東西了!
綜合運用篇就是來一次運用前面的所學!
(應用app) 用 OpenCV 來製作一個照片文件掃描機吧!我們要製作一個照片文件掃描機,邏輯上大致要完成以下步驟:
* 主程式 (讀取圖片)
* 運用昨天的內容 ,製作一個能讀取座標點的滑鼠控制畫面 (滑鼠處理)
* 利用滑鼠控制回傳的座標進行透視投影運算
主程式 (讀取圖片)#Read the destination image
ori_img = cv2.imread("./testdata/paper.jpg")
print("origin image: ")
show_img(ori_img)
print("Click on four corners of bllboard and the press ENTER")
points = get_points(ori_img)
pts1 = np.float32(points)
這部分就單純的讀取圖片,
我們使用我們定義的 get_points
來幫助我們找到輪廓的四個座標點
。
(注意:請從左上角
,依照順時針
順序,在圖片的四個角落點四個點
)
運用昨天的內容 ,製作一個能讀取座標點的滑鼠控制畫面 (滑鼠處理)def mouse_handler(event, x, y, flags, data):
if event == cv2.EVENT_LBUTTONDOWN:
# 標記點位置
cv2.circle(data['img'], (x,y), 30, (0,0,255), -1)
# 改變顯示 window 的內容
cv2.imshow("Image", data['img'])
# 顯示 (x,y) 並儲存到 list中
print("get points: (x, y) = ({}, {})".format(x, y))
data['points'].append((x,y))
def get_points(img):
# 建立 data dict, img:存放圖片, points:存放點
data = {}
data['img'] = img.copy()
data['points'] = []
# 建立一個 window
cv2.namedWindow("Image", 0)
# 改變 window 成為適當圖片大小
h, w, dim = img.shape
print("img height, width: ({}, {})".format(h, w))
cv2.namedWindow("Image", cv2.WINDOW_AUTOSIZE) # cv2.WINDOW_NORMAL)
# 顯示圖片在 window 中
cv2.imshow('Image',img)
# 利用滑鼠回傳值,資料皆保存於 data dict中
cv2.setMouseCallback("Image", mouse_handler, data)
# 等待關閉視窗,藉由 OpenCV 內建函數釋放資源
cv2.waitKey(0)
cv2.destroyAllWindows()
# 回傳點 list
return data['points']
這部分都與昨日的成品相同,可參考昨天的描述。
利用滑鼠控制回傳的座標進行透視投影運算target_height = 842 # A4
target_width = 595 # A4
pts2 = np.float32([[0,0],[target_width,0],[target_width,target_height],[0,target_height]])
# 計算最佳變形矩陣
M = cv2.getPerspectiveTransform(pts1, pts2)
# 將原圖使用變形矩陣做透視變換
res = cv2.warpPerspective(ori_img, M, (target_width, target_height))
print("photo scanner result: ")
show_img(res, bigger=True)
print("Doing threshold: ")
resgray = cv2.cvtColor(res, cv2.COLOR_BGR2GRAY) # 先將圖片轉為灰階
# Otsu's thresholding
ret, thresh = cv2.threshold(resgray,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
show_img(thresh, bigger=True)
# 顯示圖片在 window 中
cv2.imshow('Scanner',res)
cv2.imshow('Threshold',thresh)
cv2.waitKey(0)
cv2.destroyAllWindows()
我們先定義好文件的大小 (這裡是 A4紙的大小(842x595)
),
我們使用 cv2.getPerspectiveTransform
,計算最佳變形矩陣,
我們可透過這行的結果將原圖片透過矩陣運算做最適當的變形。
我們運用上面算出的矩陣搭配 cv2.warpPerspective
,
將原圖進行透視變換 (上一行只有計算最佳變形矩陣,這一行才有變形)。
算出來的就是我們要的結果囉~~~
最後我們還能再自己使用 Otsu's thresholding
做二值化,
將文件轉為黑白文件,就像印表機印出來的結果一樣呢!
(自己做就不用載需要付費的app囉)
本文同步發佈在: 第 12 屆 iT 邦幫忙鐵人賽
【沒錢ps,我用OpenCV!】Day 24 – 綜合運用3,(應用app) 用 OpenCV 來製作一個照片文件掃描機吧! photo scanner 透視投影
Referencehttps://blog.csdn.net/on2way/article/details/46801063
⭐Python OpenCV 相關文章整理⭐: ⭐基礎知識篇⭐: 1. 【OpenCV】1 – 安裝 python OpenCV install 電腦中圖片的基本概念總整理 (附錄:OpenCV 快速測試用程式碼) 2. 【OpenCV】2 – OpenCV 圖片的讀取、顯示、存檔 (load, show, save),附贈簡易理解「相對路徑」與「絕對路徑」 3. 【OpenCV】OpenCV 利用 python OpenCV 查詢 image 大小, img shape sample code (內附範例程式碼) ⭐基本圖像處理篇⭐: 1. 【OpenCV】OpenCV 利用 python OpenCV 縮放圖片 image 大小, cv2 resize (內附程式碼) 2. 【OpenCV】3 – python OpenCV 的剪裁、旋轉、縮放 (crop, rotate, resize) 3. 【OpenCV】4 – 運用 OpenCV 調整光線 (modify brightness, intensity) 4. 【OpenCV】5 – 運用 OpenCV 調整亮度、飽和度(透過轉移至 HLS 顏色空間) modify lightness, saturation 5. 【OpenCV】6 – 運用 OpenCV 調整色調(冷色系/暖色系)、色溫(白平衡)modify color temperature, white balance 6. 【OpenCV】7 – 運用 OpenCV 為圖片增加一些顆粒感 (增加高斯噪點) add gaussian noise 7. 【OpenCV】8 – 運用 OpenCV 改變圖片的對比度 modify contrast (內含:網路上常見錯誤調整對比度方式的分析) 8. 【OpenCV】9 – 運用 OpenCV 降低圖片的高光 reduce highlights 9. 【OpenCV】11 – OpenCV 建立新空白圖、畫點、畫圓 create new pictures, draw points and draw circle 10. 【OpenCV】12 – 運用 OpenCV 畫線、畫矩形、畫橢圓 draw lines, draw rectangle, draw ellipse 11. 【OpenCV】13 – 運用 OpenCV 在圖片上寫文字、查色碼、顯示色碼顏色 write text, get and show RGB Color Code ⭐進階圖像處理篇⭐: 1. 【OpenCV】14 – 運用 OpenCV 顯示圖片直方圖、分離與合併RGB通道 show histogram, split, merge RGB channel 2. 【OpenCV】15 – OpenCV 當然也有像 ps 圖層的功能! 什麼?圖片也能加減法?! Add, Subtract, AddWeighted 3. 【OpenCV】16 – 運用 OpenCV 幫助我們找圖片的輪廓(高斯模糊、Canny) cv2.GaussianBlur, cv2.Canny 4. 【OpenCV】17 – 運用 OpenCV 的終極圖層處理大全, 想P圖該怎麼P (bitwise_or, and, xor, not, addWeighted) 5. 【OpenCV】18 – 運用 OpenCV 做圖片二值化,產生黑白的圖片吧!cv2.threshold 各種選擇參數大全 6. 【OpenCV】19 – OpenCV 的圖片自適應二值化,產生更好效果的黑白圖片!cv2.adaptiveThreshold 7. 【OpenCV】20 – OpenCV 的各種 Threshold 方法整理,Otsu’s Threshold 大津二值化,自動計算最佳閥值,做出最好的黑白效果圖! 8. 【OpenCV】26 – 銳化圖片,將模糊的圖片變得更清晰吧! sharpen images ⭐冷門應用篇⭐: 1. 【OpenCV】python OpenCV 分析影像模糊程度 檢測圖片模糊 blur sample code (內含範例程式碼) 2. 【OpenCV】21 – OpenCV 也有 photoshop 的魔術棒工具?! 漫水填充法 cv2.floodFill (Magic Wand Tool) 3. 【OpenCV】27 – 顏色映射 – OpenCV 內建的自動配色?! auto recolor images, cv2.applyColorMap ⭐影片處理篇⭐: 1. 【OpenCV】OpenCV 利用 python OpenCV 將圖片製作成一部影片 (內附程式碼) make video from images 2. 【OpenCV】OpenCV 利用 python OpenCV 將一部影片拆成一張張圖片 sample code (內附程式碼) get images from video 3. 【OpenCV】用 OpenCV 開啟 rtsp 即時影像串流 sample code (內含範例程式碼) – python OpenCV rtsp 4. 【OpenCV】python pyinotify video player 利用 OpenCV + inotify 製作即時影片播放器 sample code (內含範例程式碼) ⭐綜合應用篇⭐: 1. 【OpenCV】10 – 日系濾鏡總集篇,運用 OpenCV 製作屬於自己的濾鏡吧 (內含可於網頁上直接完成濾鏡的 colab ) 2. 【OpenCV】22 – 綜合運用1,用 OpenCV 來P圖囉! 來運用各種之前學習的各種東西吧! merge two images 3. 【OpenCV】23 – 綜合運用2,(資料標註) 用 OpenCV 來製作一個標記點小工具吧! 滑鼠與視窗控制 label points 4. 【OpenCV】24 – 綜合運用3,(應用app) 用 OpenCV 來製作一個照片文件掃描機吧! photo scanner 透視投影 5. 【OpenCV】25 – 綜合運用4,用 OpenCV 來把圖片p到各種奇怪的地方吧! 透視投影 cv2.warpPerspective, merge two images 6. 【OpenCV】28 – Final Project v1,於是沒錢買ps的我,開發了自己的photoshop,我的天啊 My photoshop made by OpenCV 7. 【OpenCV】29 – Final Project v2,於是沒錢買ps的我,開發了自己的photoshop,我的天啊 My photoshop made by OpenCV 8. 【OpenCV】30 – Final Project v3,於是沒錢買ps的我,開發了自己的photoshop,我的天啊 My photoshop made by OpenCV 9. 【OpenCV】用 python OpenCV 計算 iou 的方法 (內附範例程式碼) sample code ⭐【喜歡我的文章嗎? 歡迎幫我按讚~ 讓基金會請創作者喝一杯咖啡! 】
如果喜歡我的文章,請幫我在下方【按五下Like 】 (Google, Facebook 免註冊 ),會由 「LikeCoin 」 贊助作者鼓勵繼續創作,讀者們「只需幫忙按讚,完全不用出錢 」哦!