私はこのような辞書の定義を持つ画像を扱っています: 画像の上部またはボットの境界線に触れると、隣接する項目(上部およびボット)からこれらの小さな要素を取り除きたい 与えられたスコープと一致する配列の配列で値のペアをトリミングする方法は?
私はそれを実行しようとした方法であった:この画像は(赤)を示すように、(上部またはボットに触れる任意の実際の文字を含まない)、それからのさらなる20より画素を拡張 1ロード画像グレースケールで 2.画像の輪郭を取得するにはcv2.findContours
3. x = 0から始まりx = 20より後に終了する輪郭を見つける 4. F高さ1で始まり高さ21で終わる等高線ind 5.これらの等高線を白で塗りつぶします。
問題はcv2.findContours
は座標のペアの配列の配列のリストを返します。特定の座標ペアを削除することができましたが、ここではそれを適用するのが難しいです。
私は多数のアプローチを試してみましたが、現在、私はこれで立ち往生しています:私はここにfindContours
を使用する必要はないと思う
import cv2
import os
def def_trimmer(img):
height, width = img.shape
img_rev = cv2.bitwise_not(img)
_, contours, _ = cv2.findContours(img_rev,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
# contours = np.concatenate(contours, axis = 0)
# contours = contours[((contours<[20-1, width])|(contours>[height-20-1, -1])).all(axis=(1,2))]
for outer in contours:
# for outer2 in outer1:
oldlen = len(outer)
outer = outer[(((outer<[20-1, width])|(outer>[height-20-1, -1])).all(axis=(1, 2)))]
newlen = len(outer)
print((oldlen, newlen))
cv2.drawContours(img,contours,-1,(255,255,255),-1)
return(img)
img = cv2.imread("img.png")
img_out = def_trimmer(img)
cv2.imshow("out", img_out)
提案していただきありがとうございます。それは確かに速くて簡単かもしれません。私はすぐにそれを試してみましょう:) – MrVocabulary