iT邦幫忙

0

python opencv 擷取圖片中矩形

有許多這一類的圖片
中間都有個矩形
若是想透過opencv或其他套件
該如何挖出中間那個矩形
原本想用cv2.findContours
但由於中央有些黑色會造成無法完整切割
二值化又會被上下相同灰階度的區塊影響
不知道能不能透過opencv處理
若真的不行是否只能透過 Fast RCNN這類的方法解決了
謝謝~
https://ithelp.ithome.com.tw/upload/images/20201025/20119920sxIc1xPzFN.jpg
https://ithelp.ithome.com.tw/upload/images/20201025/20119920CSI6el2w2E.jpg
https://ithelp.ithome.com.tw/upload/images/20201025/20119920nGtJC5Mb6t.jpg

看更多先前的討論...收起先前的討論...
或許可以考慮用指定的面積、位置跟平均顏色把方框內白色部分的Contour先抓出來
之後再用Contour的頂點或者是外接矩形的方式把完整的方框取出
二值化設定適度的閥值,處理後的圖片應該只剩黑與白,而不會有灰階色才是,再把圖片降噪,轉正,再按你要取的方塊特性由上往下由右抓取左上右下邊界
新手練習獻醜

import cv2
import numpy as np

m = '20119920sxIc1xPzFN.jpg' #圖片名稱
m0 = cv2.imread(m, 1) #抓取圖片
m1 =cv2.cvtColor(m0, cv2.COLOR_BGR2GRAY) #圖片轉詼諧
m2=cv2.Canny(m1,200,250) #二極化
m3=cv2.dilate(m2, np.ones((4,4))) #膨脹
m4=cv2.erode(m3, np.ones((4,4))) #侵蝕
m5=cv2.erode(m4, np.ones((2,2))) #第二次侵蝕
a, b=cv2.findContours(m5, cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE) #取得輪廓資料
x, y, h, w =cv2.boundingRect(a[0]) #取得包覆指定輪廓點的最小正矩形
m6 = m0[y:y+h, x: x+w] #裁切所需要的範圍
n = m + '_zoom.jpg'
cv2.imwrite(f"./{n}", m6) #檔案儲存

cv2.imshow('M', m6)
cv2.waitKey(0)
cv2.destroyAllWindows()
draguitar iT邦新手 5 級 ‧ 2020-12-17 22:29:08 檢舉
m2=cv2.Canny(m1,200,250)
註解應改為邊緣偵測
感謝你

1 個回答

0
Dove49230722
iT邦新手 5 級 ‧ 2020-12-17 22:26:15
最佳解答

新手練習獻醜
其中一張圖片因為太多雜訊所以抓不到

import cv2
import numpy as np

m = '20119920sxIc1xPzFN.jpg' #圖片名稱
m0 = cv2.imread(m, 1) #抓取圖片
m1 =cv2.cvtColor(m0, cv2.COLOR_BGR2GRAY) #圖片轉詼諧
m2=cv2.Canny(m1,200,250) #二極化
m3=cv2.dilate(m2, np.ones((4,4))) #膨脹
m4=cv2.erode(m3, np.ones((4,4))) #侵蝕
m5=cv2.erode(m4, np.ones((2,2))) #第二次侵蝕
a, b=cv2.findContours(m5, cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE) #取得輪廓資料
x, y, h, w =cv2.boundingRect(a[0]) #取得包覆指定輪廓點的最小正矩形
m6 = m0[y:y+h, x: x+w] #裁切所需要的範圍
n = m + '_zoom.jpg'
cv2.imwrite(f"./{n}", m6) #檔案儲存

cv2.imshow('M', m6)
cv2.waitKey(0)
cv2.destroyAllWindows()
https://ithelp.ithome.com.tw/upload/images/20201217/20133585XH2Qr5AoO1.jpghttps://ithelp.ithome.com.tw/upload/images/20201217/20133585EymsDJ8RyR.jpg

我要發表回答

立即登入回答