我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python图片处理之图片裁剪教程

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python图片处理之图片裁剪教程

一、操作流程

首先复制代码会吧?

1.有张照片

这是网上随便找的一张照片,自行保存测试

在这里插入图片描述

2.看看照片

运行代码,其中show_img函数是展示照片

3.选择角点

按照左上,右上,右下,左下的顺序选择四个角点

在这里插入图片描述

如果担心自己选不好,可以直接去除我代码里的points的注释,那是我自己用的原版

4.最终结果

在这里插入图片描述

二、代码分析

import 没什么好说的


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

获取图片的长宽


#输入cv.imread后的图片,通过点击四个点选择要裁剪的部分
def get_window_size(class="lazy" data-src, bound=600):
    h,w = class="lazy" data-src.shape[0], class="lazy" data-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['class="lazy" data-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(class="lazy" data-src):
    points = []
    indexer = Indexer()
    h, w=get_window_size(class="lazy" data-src)
    win_name = 'get_points'
    cv.namedWindow(win_name, cv.WINDOW_NORMAL)
    cv.resizeWindow(win_name, width=w, height=h)
    cv.imshow(win_name, class="lazy" data-src)
    cv.setMouseCallback(win_name, on_EVENT_LBUTTONDOWN,
                        param={'class="lazy" data-src': class="lazy" data-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(class="lazy" data-src):
    win_name = 'show_img'
    h, w=get_window_size(class="lazy" data-src)
    cv.namedWindow(win_name, cv.WINDOW_NORMAL)
    cv.resizeWindow(win_name, width=w, height=h)
    cv.imshow(win_name, class="lazy" data-src)
    cv.waitKey(0)
    cv.destroyAllWindows()

将图片截取,并按照指定的长宽比恢复成矩形


def photo_cut_restore(class="lazy" data-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(class="lazy" data-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'
    class="lazy" data-src = cv.imread(path)
    class="lazy" data-src_copy = class="lazy" data-src.copy()

     show_img(class="lazy" data-src)


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

    result=photo_cut_restore(class="lazy" data-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(class="lazy" data-src, bound=600):
    h,w = class="lazy" data-src.shape[0], class="lazy" data-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['class="lazy" data-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(class="lazy" data-src):
    points = []
    indexer = Indexer()
    h, w=get_window_size(class="lazy" data-src)
    win_name = 'get_points'
    cv.namedWindow(win_name, cv.WINDOW_NORMAL)
    cv.resizeWindow(win_name, width=w, height=h)
    cv.imshow(win_name, class="lazy" data-src)
    cv.setMouseCallback(win_name, on_EVENT_LBUTTONDOWN,
                        param={'class="lazy" data-src': class="lazy" data-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(class="lazy" data-src):
    win_name = 'show_img'
    h, w=get_window_size(class="lazy" data-src)
    cv.namedWindow(win_name, cv.WINDOW_NORMAL)
    cv.resizeWindow(win_name, width=w, height=h)
    cv.imshow(win_name, class="lazy" data-src)
    cv.waitKey(0)
    cv.destroyAllWindows()

def photo_cut_restore(class="lazy" data-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(class="lazy" data-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'
    class="lazy" data-src = cv.imread(path)
    class="lazy" data-src_copy = class="lazy" data-src.copy()

    # show_img(class="lazy" data-src)


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

    result=photo_cut_restore(class="lazy" data-src_copy,points,H,W)

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

到此这篇关于Python图片处理之图片裁剪教程的文章就介绍到这了,更多相关Python图片裁剪内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python图片处理之图片裁剪教程

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python图片处理之图片裁剪的示例分析

小编给大家分享一下Python图片处理之图片裁剪的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、操作流程首先会吧?1.有张照片这是网上随便找的一张照片,自行保存测试2.看看照片运行代码,其中show_img函数
2023-06-15

Python:裁剪图片

from PIL import Imagedef clipping(img, width): ''' 通过获取像素点,然后将像素点等于255(透明),从而完成修剪图片的操作 :param img: Image对象 :
2023-01-31

python 裁剪图片

最近笔者有个东西,需要上传的时候,让用户来裁剪图片,网上基本的做法,就是在本地的浏览器裁剪完毕,把裁剪后的坐标情况告诉服务器,让服务器来裁剪,因为笔者不是用PHP,无法享受GD模块的帮助了,所以利用python来裁剪。# -*- codin
2023-01-31

怎么用python裁剪图片

这篇文章主要介绍“怎么用python裁剪图片”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么用python裁剪图片”文章能帮助大家解决问题。一、 安装PIL库如果此前没有安装过PIL库,在pyth
2023-07-02

Python PIL图片怎么按比例裁剪

这篇文章主要介绍“Python PIL图片怎么按比例裁剪”,在日常操作中,相信很多人在Python PIL图片怎么按比例裁剪问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python PIL图片怎么按比例裁剪
2023-06-30

Android裁剪图片为圆形图片的实现原理与代码

以前在eoe论坛中找过裁剪图片为圆形图片的方法,但是效果都不是很理想,这几天因为公司业务的要求,需要对头像进行裁剪以圆形的方式显示,这个方法是根据传入的图片的高度(height)和宽度(width)决定的,如果是 width <= heig
2022-06-06

Python实现图片裁剪的两种方式——P

在这篇文章里我们聊一下Python实现图片裁剪的两种方式,一种利用了Pillow,还有一种利用了OpenCV。两种方式都需要简单的几行代码,这可能也就是现在Python那么流行的原因吧。首先,我们有一张原始图片,如下图所示:原始图片然后,我
2023-01-31

微信小程序实现图片裁剪功能

微信小程序实现图片裁剪功能随着微信小程序的快速发展,越来越多的开发者开始探索小程序的潜力。其中,图片处理功能是小程序中常见的需求之一。本文将介绍如何在微信小程序中实现图片裁剪功能,并提供具体的代码示例,帮助开发者快速实现这一功能。准备工作在
微信小程序实现图片裁剪功能
2023-11-21

android编程实现系统图片剪裁的方法

本文实例讲述了android编程实现系统图片剪裁的方法。分享给大家供大家参考,具体如下:package cn.test; import java.io.File; import java.text.SimpleDateFormat; imp
2022-06-06

JavaScript如何实现小程序图片裁剪功能

这篇文章主要介绍“JavaScript如何实现小程序图片裁剪功能”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JavaScript如何实现小程序图片裁剪功能”文章能帮助大家解决问题。图片上传与处理要
2023-07-05

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录