為此,斗膽提出了如下的算法:
1、找到圖像中心點,並獲取中心點所在橫和縱的全部像素
2、使用numpy的向量化操作,比較橫或縱像素點與黑邊阈值的大小
3、找到上述比較結果中各處為True的結果,即為去除黑邊後的圖像邊界
import cv2
import numpy as np
threshold = 40 # 阈值
gray = cv2.imread('./bgRemovedTEst.png') # 導入圖片
gray = cv2.cvtColor(gray, cv2.COLOR_RGB2GRAY) # 轉換為灰度圖像
nrow = gray.shape[0] # 獲取圖片尺寸
ncol = gray.shape[1]
rowc = gray[:,int(1/2*nrow)] # 無法區分黑色區域超過一半的情況
colc = gray[int(1/2*ncol),:]
rowflag = np.argwhere(rowc > threshold)
colflag = np.argwhere(colc > threshold)
left,bottom,right,top = rowflag[0,0],colflag[-1,0],rowflag[-1,0],colflag[0,0]
cv2.imshow('name',gray[left:right,top:bottom]) # 效果展示
cv2.waitKey()
這樣做的優點是顯而易見的,代碼邏輯清晰明了,且沒有使用for循環效率極高,時間復雜度是o(n),對於尋常圖像大小比傳統做法快了100倍的樣子。
但是上述例程沒有辦法處理黑邊范圍超過一半的情況。為此可以將手動取中心點作為分界線,改成隨機取點,直到該點不為黑邊為止。