在現實的生活中,我們可能會遇到一些美好的或是珍貴的圖片被噪聲干擾,比如舊照片的折痕,比如鏡頭上的灰塵或污漬,更或者是某些我們想為我所用但有討厭水印,那么有沒有一種辦法可以消除這些噪聲呢?
答案是肯定的,依然是被我們用了無數次的OpenCV這款優秀的框架。
OpenCV
目前,OpenCV逐步成為一個通用的基礎研究和產品開發平臺。OpenCV這一名稱包含了Open和 Computer Vision兩者的意思。實際上,Open指Open Source(開源,即開放源代碼),Computer Vision則指計算機視覺。OpenCV的發展對軟件的開發具有重要影響。想要了解更多的話大家可以參考這篇文章:http://www.zmynmublwnt.cn/article/123924.html
效果預覽
圖片修復原理
那OpenCV究竟是怎么實現的,簡單的來說就是開發者標定噪聲的特征,在使用噪聲周圍的顏色特征推理出應該修復的圖片的顏色,從而實現圖片修復的。
程序實現解析
- 標定噪聲的特征,使用cv2.inRange二值化標識噪聲對圖片進行二值化處理,具體代碼:cv2.inRange(img, np.array([240, 240, 240]), np.array([255, 255, 255])),把[240, 240, 240]~[255, 255, 255]以外的顏色處理為0;
- 使用OpenCV的dilate方法,擴展特征的區域,優化圖片處理效果;
- 使用inpaint方法,把噪聲的mask作為參數,推理并修復圖片;
完整代碼
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
#coding=utf-8 #圖片修復 import cv2 import numpy as np path = "img/inpaint.png" img = cv2.imread(path) hight, width, depth = img.shape[ 0 : 3 ] #圖片二值化處理,把[240, 240, 240]~[255, 255, 255]以外的顏色變成0 thresh = cv2.inRange(img, np.array([ 240 , 240 , 240 ]), np.array([ 255 , 255 , 255 ])) #創建形狀和尺寸的結構元素 kernel = np.ones(( 3 , 3 ), np.uint8) #擴張待修復區域 hi_mask = cv2.dilate(thresh, kernel, iterations = 1 ) specular = cv2.inpaint(img, hi_mask, 5 , flags = cv2.INPAINT_TELEA) cv2.namedWindow( "Image" , 0 ) cv2.resizeWindow( "Image" , int (width / 2 ), int (hight / 2 )) cv2.imshow( "Image" , img) cv2.namedWindow( "newImage" , 0 ) cv2.resizeWindow( "newImage" , int (width / 2 ), int (hight / 2 )) cv2.imshow( "newImage" , specular) cv2.waitKey( 0 ) cv2.destroyAllWindows() |
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。
原文鏈接:https://www.cnblogs.com/vipstone/p/9130688.html