中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python圖片處理之圖片裁剪的示例分析

發布時間:2021-05-28 09:46:05 來源:億速云 閱讀:157 作者:小新 欄目:開發技術

小編給大家分享一下Python圖片處理之圖片裁剪的示例分析,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

一、操作流程

首先會吧?

1.有張照片

這是網上隨便找的一張照片,自行保存測試

Python圖片處理之圖片裁剪的示例分析

2.看看照片

運行代碼,其中show_img函數是展示照片

3.選擇角點

按照左上,右上,右下,左下的順序選擇四個角點

Python圖片處理之圖片裁剪的示例分析

如果擔心自己選不好,可以直接去除我代碼里的points的注釋,那是我自己用的原版

4.最終結果

Python圖片處理之圖片裁剪的示例分析

二、代碼分析

import 沒什么好說的

#如果python沒有安裝cv2,那么就安裝python-opencv就好
import cv2 as cv
import numpy as np

獲取圖片的長寬

#輸入cv.imread后的圖片,通過點擊四個點選擇要裁剪的部分
def get_window_size(src, bound=600):
    h,w = src.shape[0], src.shape[1]
    if h > w:
        h, w = bound, int(w*bound/h)
    else:
        h, w = int(h*bound/w), bound
    return (h, w)

通過鼠標獲取圖片的坐標點,順序是左上,右上,右下,左下

class Indexer:
    def __init__(self, bound=4):
        self.id = 0
        self.bound = bound

    def get_id(self):
        self.id = (self.id + 1)
        return (self.id)


def on_EVENT_LBUTTONDOWN(event, x, y, flags, param):
    if event == cv.EVENT_LBUTTONDOWN:
        img = param['src']
        win_name = param['window']
        indexer = param['indexer']
        points = param['points']

        curr_id = indexer.get_id()
        points.append((x, y))
        print('第{}個頂點: ({},{})'.format(curr_id, x, y))

        cv.circle(img, (x, y), 10, (0, 0, 255), thickness=2)
        cv.putText(
            img,
            str(curr_id),  # 文字
            (x, y),  # 坐標
            cv.FONT_HERSHEY_PLAIN,
            5,  # 字號
            (0, 0, 255),  # 字體顏色
            thickness=2  # 粗細
        )

        cv.imshow(win_name, img)

#輸入cv.imread后的圖片,通過點擊四個點選擇要裁剪的部分
def get_points(src):
    points = []
    indexer = Indexer()
    h, w=get_window_size(src)
    win_name = 'get_points'
    cv.namedWindow(win_name, cv.WINDOW_NORMAL)
    cv.resizeWindow(win_name, width=w, height=h)
    cv.imshow(win_name, src)
    cv.setMouseCallback(win_name, on_EVENT_LBUTTONDOWN,
                        param={'src': src, 'window': win_name, 'indexer': indexer, 'points': points})
    cv.waitKey(0)
    cv.destroyAllWindows()
    if len(points)>4:
        return points[0:4]
    # print(points)
    # points=[(2, 14), (90, 50), (87, 194), (1, 204)]
    return points

#輸入cv.imread后的圖片,展示圖片長什么樣
def show_img(src):
    win_name = 'show_img'
    h, w=get_window_size(src)
    cv.namedWindow(win_name, cv.WINDOW_NORMAL)
    cv.resizeWindow(win_name, width=w, height=h)
    cv.imshow(win_name, src)
    cv.waitKey(0)
    cv.destroyAllWindows()

將圖片截取,并按照指定的長寬比恢復成矩形

def photo_cut_restore(src,points,H,W):

    target_points = [(0, 0), (W, 0), (W, H), (0, H)]
    points, target_points = np.array(points, dtype=np.float32), np.array(target_points, dtype=np.float32)
    M = cv.getPerspectiveTransform(points, target_points)
    # print('透視變換矩陣:', M)

    result = cv.warpPerspective(src_copy, M, (0, 0))
    result = result[:H, :W]
    win_name = 'Result'
    cv.namedWindow(win_name, cv.WINDOW_NORMAL)
    cv.resizeWindow(win_name, width=W, height=H)
    cv.imshow(win_name,result)
    cv.waitKey(0)
    cv.destroyAllWindows()
    return  result

主程序

if __name__ == '__main__':

    path = './1.jpg'
    src = cv.imread(path)
    src_copy = src.copy()

     show_img(src)


    W = 20
    H = 20
    # points=[(112, 308), (175, 310), (176, 369), (113, 369)]
    
    points=get_points(src)
    n = 20
    W = int(W * n)
    H = int(H * n)

    result=photo_cut_restore(src_copy,points,H,W)

    output_file = 'result.jpg'
    cv.imwrite(output_file, result)

三、懶人一鍵

誒,氣不氣,好不容易一段段復制完,結果最后居然有一鍵復制的地方

import cv2 as cv
import numpy as np

#輸入cv.imread后的圖片,通過點擊四個點選擇要裁剪的部分
def get_window_size(src, bound=600):
    h,w = src.shape[0], src.shape[1]
    if h > w:
        h, w = bound, int(w*bound/h)
    else:
        h, w = int(h*bound/w), bound
    return (h, w)


class Indexer:
    def __init__(self):
        self.id = 0

    def get_id(self):
        self.id = (self.id + 1)
        return (self.id)


def on_EVENT_LBUTTONDOWN(event, x, y, flags, param):
    if event == cv.EVENT_LBUTTONDOWN:
        img = param['src']
        win_name = param['window']
        indexer = param['indexer']
        points = param['points']

        curr_id = indexer.get_id()
        points.append((x, y))
        print('第{}個頂點: ({},{})'.format(curr_id, x, y))

        cv.circle(img, (x, y), 10, (0, 0, 255), thickness=2)
        cv.putText(
            img,
            str(curr_id),  # 文字
            (x, y),  # 坐標
            cv.FONT_HERSHEY_PLAIN,
            5,  # 字號
            (0, 0, 255),  # 字體顏色
            thickness=2  # 粗細
        )

        cv.imshow(win_name, img)

#輸入cv.imread后的圖片,通過點擊四個點選擇要裁剪的部分
def get_points(src):
    points = []
    indexer = Indexer()
    h, w=get_window_size(src)
    win_name = 'get_points'
    cv.namedWindow(win_name, cv.WINDOW_NORMAL)
    cv.resizeWindow(win_name, width=w, height=h)
    cv.imshow(win_name, src)
    cv.setMouseCallback(win_name, on_EVENT_LBUTTONDOWN,
                        param={'src': src, 'window': win_name, 'indexer': indexer, 'points': points})
    cv.waitKey(0)
    cv.destroyAllWindows()
    if len(points)>4:
        return points[0:4]
    # print(points)
    # points=[(2, 14), (90, 50), (87, 194), (1, 204)]
    return points

#輸入cv.imread后的圖片,展示圖片長什么樣
def show_img(src):
    win_name = 'show_img'
    h, w=get_window_size(src)
    cv.namedWindow(win_name, cv.WINDOW_NORMAL)
    cv.resizeWindow(win_name, width=w, height=h)
    cv.imshow(win_name, src)
    cv.waitKey(0)
    cv.destroyAllWindows()

def photo_cut_restore(src,points,H,W):

    target_points = [(0, 0), (W, 0), (W, H), (0, H)]
    points, target_points = np.array(points, dtype=np.float32), np.array(target_points, dtype=np.float32)
    M = cv.getPerspectiveTransform(points, target_points)
    # print('透視變換矩陣:', M)

    result = cv.warpPerspective(src_copy, M, (0, 0))
    result = result[:H, :W]
    win_name = 'Result'
    cv.namedWindow(win_name, cv.WINDOW_NORMAL)
    cv.resizeWindow(win_name, width=W, height=H)
    cv.imshow(win_name,result)
    cv.waitKey(0)
    cv.destroyAllWindows()
    return  result


if __name__ == '__main__':

    path = './3.jpg'
    src = cv.imread(path)
    src_copy = src.copy()

    # show_img(src)


    W = 20
    H = 20
    # points=[(124, 182), (181, 177), (180, 243), (125, 266)]
    points=get_points(src)
    print(points)
    n = 20
    W = int(W * n)
    H = int(H * n)

    result=photo_cut_restore(src_copy,points,H,W)

    output_file = 'result.jpg'
    cv.imwrite(output_file, result)

看完了這篇文章,相信你對“Python圖片處理之圖片裁剪的示例分析”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

常熟市| 乌拉特前旗| 烟台市| 涡阳县| 康平县| 霍山县| 云霄县| 黑龙江省| 阿拉善盟| 综艺| 顺昌县| 宜君县| 新泰市| 方山县| 苍梧县| 清苑县| 陆川县| 罗甸县| 玉树县| 永济市| 五原县| 承德市| 崇礼县| 乌什县| 娱乐| 大足县| 卫辉市| 台前县| 烟台市| 蒙城县| 时尚| 辽源市| 安多县| 太康县| 靖州| 炉霍县| 公安县| 汽车| 黄梅县| 博湖县| 汤阴县|