画像を傾き補正したいと思います。私は(確かに助けたくさんの)プログラムを書いたことを行うには:OpenCV/Python:cv2.minAreaRectは、回転した矩形を返しません。
- は(などTHRESH、拡張を、)を計算しやすいように画像を変換すると、すべてのオブジェクトの周りの輪郭
- を計算を描きますテキストの輪郭の周りの4つの極端なポイントが
- が
アイデアはcv2.minAreaRectがどの私ができるだけでなく角度を返すということでしたcv2.minAreaRectを使用して、その領域の周囲に四角形を描画します(マージンを使って何を無視して)イメージの傾き補正に使用します。しかし、私の場合は-90°です。
サンプル入力画像が表示されます。 私はという結果を見ることができます。
私は「クリーン」の画像上のプログラムをテストした(MS Wordのスクリーンショットは、Gimpの中≈30°をrotaten)、それは、同一の結果を与えました。
マイコード:
import numpy as np
import cv2
import itertools
img = cv2.imread('zuo.png')
imgray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(imgray,64,255,0)
############
kernel = np.ones((2,2),np.uint8)
img_e = cv2.dilate(thresh,kernel,iterations = 1)
# cv2.imwrite("out_eroded.png", img_e)
# http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_imgproc/py_morphological_ops/py_morphological_ops.html
# img_e = thresh
############
imgbw, contours, hierarchy = cv2.findContours(img_e,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
# imgbw, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
margin_distance = 25
def flatten(arr, n = 1):
# print(arr)
ret = list(itertools.chain.from_iterable(arr))
# print(ret)
if n != 1:
return flatten(ret, n - 1)
else:
return ret
# print(list(flatten([[1,2,3],[4,5,6], [7], [8,9]])))
def get_min_max_values(cs, im_y, im_x):
# print(flatten(cs), 1)
# print(im_y, im_x)
min_y = im_y - margin_distance
min_x = im_x - margin_distance
max_y = margin_distance
max_x = margin_distance
for lvl1 in cs:
for lvl2 in lvl1:
x, y = lvl2[0]
# x = im_x - x
# y = im_y - y
max_y = max(y, max_y) if y + margin_distance < im_y else max_y
max_x = max(x, max_x) if x + margin_distance < im_x else max_x
min_y = min(y, min_y) if y > margin_distance else min_y
min_x = min(x, min_x) if x > margin_distance else min_x
return ((min_y, min_x), (min_y, max_x), (max_y, min_x), (max_y, max_x))
new_rect = get_min_max_values(contours, len(img), len(img[0]))
new_rect = list(map(lambda x: list(x)[::-1], list(new_rect)))
print(new_rect)
rect = cv2.minAreaRect(np.int0(new_rect))
# print(rect)
print(rect)
box = cv2.boxPoints(rect)
box = np.int0(box)
img_out = cv2.drawContours(img, [box], -1, (0,0,255), 5) # -1 = wszystkie kontury
img_out = cv2.drawContours(img, contours, -1, (0,255,0), 3)
cv2.imwrite("out.png", img_out)
矩形はテキストに一致するようにスキューされていないのはなぜ?私はそれを正当化する人工物は見ません。
EDIT:追加されましたきれいな、生まれたデジタルファイル:inputとoutput。
あなたは 'new_rect'に含まれる点(赤い丸または任意で)をプロットすることはできますか? – Miki
GIMPイメージと結果も追加できますか? – Micka
get_min_max_valuesでは、axis aligned rect(コーナーポイント)を返すので、minAreaRectが最適化します。 – Micka