이미지에서 A4 인쇄를 잘라냅니다.

8916 단어 파이썬OpenCV

이미지에서 A4 인쇄를 잘라냅니다.



사진에 존재하는 인쇄물을 바로 위의 시점에서 잘라낸 이미지로 변환합니다.

위 사진을 아래 사진으로 변환할 수 있습니다.


코드에 대한 주의


  • 세로 길이의 A4 파일로 변환하므로 가로 길이의 경우 x와 y를 다시 씁니다.
  • x가 짧은 변의 길이가 되어 있으므로 적당하게 재기록하는 것.

  • 코드



    cutting_a4.py
    #カラー画像を受け取って紙を切り取って返す
    def cutting_paper(img):
        x = 2000 #切り取り後のx座標
        y = int(x*1.415)
        img_gray = gray(img)
        #2値化
        ret,img_th1  = cv2.threshold(img_gray,220,255,cv2.THRESH_TOZERO_INV)
        img_not = cv2.bitwise_not(img_th1)
        ret,img_th2  = cv2.threshold(img_not,0,255, cv2.THRESH_BINARY | cv2.THRESH_OTSU )
        #輪郭抽出
        contours, hierarchy = cv2.findContours(img_th2, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    
        #2番目にでかい四角が紙の輪郭なのでpaper_tapを取り出す
        pic_tap = None #画像の輪郭
        paper_tap = None #紙の輪郭
        for i, con in enumerate(contours):
            size = cv2.contourArea(con)
            if pic_tap is None:
                pic_tap = (con,size)
                continue
            if pic_tap[1] <= size:
                pic_tap = (con,size)
                continue
            elif paper_tap is None:
                paper_tap = (con,size)
            elif paper_tap[1] <= size:
                paper_tap = (con,size)
    
        #直線近似して描画
        epsilon = 0.1*cv2.arcLength(paper_tap[0],True)
        paper_corners= cv2.approxPolyDP(paper_tap[0],epsilon,True)#紙の頂点座標
        fix_con = np.array([[[0,0]],[[x,0]],[[x,y]],[[0,y]]], dtype="int32")#整形後のサイズ
    
        M = cv2.getPerspectiveTransform(np.float32(paper_corners),np.float32(fix_con))#変換行列の生成
        img_trans = cv2.warpPerspective(img,M,(x,y))#変換
        return img_trans
    
    img = cv2.imread('input.png',-1)
    cv2.imwrite("output.png", img)
    plt.imshow(plt.imread("output.png"))
    

    좋은 웹페이지 즐겨찾기