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

作者:怪皮蛇皮怪 时间:2022-02-02 06:32:40 

一、操作流程

首先复制代码会吧?

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)

来源:https://blog.csdn.net/weixin_43958086/article/details/117250288

标签:Python,图片,裁剪
0
投稿

猜你喜欢

  • 对跨多个表格的数据组合时需要用到的SQL

    2009-01-06 11:18:00
  • php中in_array函数用法探究

    2023-06-21 21:03:54
  • python中使用smtplib和email模块发送邮件实例

    2022-09-16 05:37:23
  • python os模块在系统管理中的应用

    2022-12-17 04:37:23
  • Python实现字典按照value进行排序的方法分析

    2022-11-03 04:27:27
  • Python-GUI wxPython之自动化数据生成器的项目实战

    2021-06-08 14:43:18
  • 对python插入数据库和生成插入sql的示例讲解

    2022-03-10 05:46:40
  • Django应用程序入口WSGIHandler源码解析

    2021-07-09 04:33:22
  • Python实现笑脸检测+人脸口罩检测功能

    2022-06-24 04:01:49
  • 前端开发中一些常用技巧总结

    2010-07-18 13:13:00
  • Python3实现飞机大战游戏

    2022-08-25 05:29:03
  • python实现数值积分的Simpson方法实例分析

    2023-08-01 17:35:01
  • Python的几种主动结束程序方式

    2022-10-12 14:39:25
  • 解决python运行启动报错问题

    2022-08-13 06:44:15
  • php简单防盗链验证实现方法

    2023-09-12 04:55:15
  • 联动选择菜单(二级联动菜单 三 级联动菜单)

    2023-06-26 22:37:55
  • 由日文出错的Bug,重新认识 Replace 函数

    2009-07-07 22:28:00
  • 妙用Dreamweaver MX共享WPS Office文件

    2010-09-05 21:18:00
  • 英文罚抄引发的艺术创意

    2008-05-13 12:02:00
  • 手把手教你制作Google Sitemap

    2008-09-04 10:35:00
  • asp之家 网络编程 m.aspxhome.com