項目說明
此項目在GitHub上開源,點擊跳轉至GitHub。如轉載,請標明轉載並寫入原文鏈接。
項目中關於python+opencv的知識點主要參考opencv的官網。
作者還擁有個人公衆號,會寫一些感悟文章,知圈,二維碼如下,歡迎掃描關注:
背景
本設計基於X射線對蛤類水產品進行含砂量自動檢測。基於python和opencv庫。
建立工程
如下,新建項目。
爲方便版本控制,建立GitHub。PyCharm嵌入了GitHub的模塊,可以直接在內部使用。如下圖。
打開該文件所在的文件夾,放入一張圖片:
寫入以下測試代碼,圖片名字爲剛纔放入的圖片。
import numpy as np
import cv2
img = cv2.imread('WeChat Image_20200221164050.jpg', 0)
cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
在此默認opencv已經裝好。如果沒有安裝,上述代碼是無法運行的。請先安裝。
寫的時候發現提示說Interpreter缺失。大概是因爲我後來換過一次硬盤,打開提示,找到interpreter並手動添加Python。
運行後彈出來剛纔添加的圖片,由於是測試的,彈出來是原像素,巨大,僅僅用來驗證前期安裝成功。
測試通過後將最適合用來研究的素材圖片放到文件夾裏備用。
圖像太過不順眼,添加窗口調用的命令,使圖像與窗口自適應以全部顯示,添加後代碼如下:
import numpy as np
import cv2
img = cv2.imread('WeChat Image_20200221164050.jpg', 0)
cv2.namedWindow('image', cv2.WINDOW_NORMAL)
cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
運行後圖像如下:
圖像處理
干擾性文字移除
移除原理:通過threshold函數將高亮的文字識別並將其它區域塗成全黑作爲mask,然後將mask通過inpaint函數標識消除文字信息。
ret, mask = cv2.threshold(img, 210, 255, cv2.THRESH_BINARY)
cv2.namedWindow('mask of characters', cv2.WINDOW_NORMAL)
cv2.imshow('mask of characters', mask)
dst = cv2.inpaint(img, mask, 3, cv2.INPAINT_NS)
cv2.namedWindow('Characters removed', cv2.WINDOW_NORMAL)
cv2.imshow('Characters removed', dst)
處理生成的mask圖像如下:
inpaint後圖像如下:
添加了cv2.xfeatures2d.SIFT_create()函數來標記沙子,結果彈出瞭如下錯誤提示:
sift = cv2.xfeatures2d.SIFT_create()
AttributeError: module 'cv2' has no attribute 'xfeatures2d'
發現是安裝的問題,要安裝contrib版本的opencv,關掉Pycharm,打開Anaconda用如下命令安裝:
pip install opencv-contrib-python
由於網不穩定,掛載VPN後多次下載失敗後終於安裝成功。如果由於網絡原因始終下載失敗,將後面的whl文件名複製去網上下載,下載後本地命令安裝。
安裝後重新運行,提示:
sift = cv2.xfeatures2d.SIFT_create()
cv2.error: OpenCV(4.2.0) C:\projects\opencv-python\opencv_contrib\modules\xfeatures2d\src\sift.cpp:1210: error: (-213:The function/feature is not implemented) This algorithm is patented and is excluded in this configuration; Set OPENCV_ENABLE_NONFREE CMake option and rebuild the library in function 'cv::xfeatures2d::SIFT::create'
再次發現問題,由於sift不再免費,裝上的最新版4.2.0無法使用其庫,要重新編譯或降級,在此爲了快速方便使用,選擇降級,再次將contrib降級爲3.4.2.17版本。使用如下命令:
pip install opencv-contrib-python==3.4.2.17
幾次網絡原因中斷後終於安裝成功:
使用的sift測試代碼如下:
sift = cv2.xfeatures2d.SIFT_create()
kp = sift.detect(dst,None)
img=cv2.drawKeypoints(dst,kp,img)
cv2.imwrite('sift_keypoints.jpg',img)
cv2.imshow('image', img)
cv2.waitKey(0)
測試結果:
Todo(sift識別沙子)
項目進行中,未完成。