首页 > 其他分享 >OpenCV透视变换-不对原图裁剪

OpenCV透视变换-不对原图裁剪

时间:2023-11-08 18:22:39浏览次数:45  
标签:原图 random OpenCV button 裁剪 cv2 height width imgOutput

前言:

最近在做透视变换,初次尝试是使用Pillow的transform方法,但是该方法在变换以后,由于需要提前设置变换后的图像尺寸,所以导致变换后的图像超出尺寸的部分会发生裁剪问题,这个现象不太适合我的目的,我的目的是对png图进行透视变换,然后贴在一张图上。

 

后来用了opencv中的方法,这个方法不会对图像进行裁剪,但是图像会出现一些多余的透明区域,因此再进行一步根据像素值非0进行裁剪即可

import cv2
import numpy as np

img = cv2.imread('sample.png')

height, width, channel = img.shape

# 判断是不是四通道,如果不是需要转换
if channel != 4:
    # 创建一个具有4通道(RGBA)的目标图像
    rgba_image = np.zeros((height, width, 4), dtype=np.uint8) 
    # 将RGB图像的通道复制到RGBA图像中 
    rgba_image[:, :, :3] = rgb_image 
    # 初始化Alpha通道为不透明(255) 
    rgba_image[:, :, 3] = 255 # 设置Alpha通道 
    img = rgba_image

# 原目标的四个点位置,分别对应,左上角,右上角,左下角,右下角
src = np.float32([[0,0], [width, 0], [0, height], [width, height]])
#变换后的四个顶点位置,设置随机值
left_top_h = random.randint(0, int(0.35*height))
left_top_w = random.randint(0, int(0.35*width))

right_top_h = random.randint(0, int(0.35*height))
right_top_w = random.randint(int(0.65*width), width)

left_button_h = random.randint(int(0.65*height), height)
left_button_w = random.randint(0, int(0.35*width))

right_button_h = random.randint(int(0.65*height), height)
right_button_w = random.randint(int(0.65*width), width)

dst = np.float32([[left_top_w, left_top_h], [right_top_w, right_top_h], [left_button_w, left_button_h], [right_button_w, right_button_h]])

matrix = cv2.getPerspectiveTransform(src, dst)
imgOutput = cv2.warpPerspective(img, matrix, (width, height))

# 对结果进行裁剪
# 查找不透明像素的边界 
non_transparent_pixels = cv2.findNonZero(imgOutput[:, :, 3]) 
x, y, w, h = cv2.boundingRect(non_transparent_pixels) 
# 裁剪图像 
cropped_image = imgOutput[y:y+h, x:x+w]

# 保存结果
cv2.imwrite('transform.png', imgOutput)


# 注意,以上是opencv的方式,如果你使用pil读取图像,返回也需要pil格式,就需要对其进行变换
# 假设pil读取png图像
pil_img = Image.open('sample.png').convert('RGBA')
img = cv2.cvtColor(np.array(pil_img), cv2.COLOR_RGBA2BGRA)

# 保存的时候将cv2格式转为pil

imgOutput = cv2.cvtColor(imgOutput, cv2.COLOR_BGRA2RGBA)
imgOutput = Image.fromarray(imgOutput)

 

标签:原图,random,OpenCV,button,裁剪,cv2,height,width,imgOutput
From: https://www.cnblogs.com/chentiao/p/17818051.html

相关文章

  • C#C++,opencv的dll中detach相关:关于调用dll后程序退出后进程仍然驻留系统列表的问题
    我在c#中调用C++的dll,内部使用了线程并detach使其独立于主线程UI运行。但后来发现程序关闭后,任务列表中的进场依然存在,即app并未实际正常退出。这个问题有很多人碰到和争论,但都没有给出明确的答案。这里提供一个理论解释和绝佳的调试排除方法:根本原因:程序退出之前,系统(或程序员......
  • OpenCV 最容易传错参数的两组Mat构造函数
    Mat构造函数中有两组函数传参特别容易传错,分别是:publicMat(introws,intcols,MatTypetype)publicMat(OpenCvSharp.Sizesize,MatTypetype)稍不注意,我们会认为下面两个mat尺寸相等,varm1=newMat(10,20,MatType.CV_8UC1);varm2=newMat(newOpenCvSharp.Size......
  • mac m1上java调用opencv
    mac1openjdk17官网上没有编译好的macm1上二进制库.需要自己下载源代码编译.https://opencv.org/releases/从这里下载源代码.如opencv-4.7.0.zip解压把opencv-4.7.0文件夹重命名为opencv在opencv同级目录下建一个文件夹build_opencvcd到build_opencv,然后执行cmake-DBU......
  • VisutalStudio配置Opencv
    VisualStudio2022配置Opencv前言求求了,让我多会点吧,上午把环境配好。我们多敲,让我再多会一些吧。这次来配下Opencv。基本流程:安装VisualStudio下载opencv配置变量配置VisualStudio测试运行开始吧~一、跳过,自己装。二、下载opencv--->点击进入下载地址<---选择版......
  • OpenCV 图像复制和图像区域读写
    图像复制共享数据,使用newMat(srcMat,...)和newMat=srcMat生成新的Mat都和原Mat共享数据,也就是说如果修改某一Mat,其他Mat也会随之改变复制全新的Mat,使用CopyTo()和Clone()方法将生成一个全新的Mat,新Mat和原Mat不共享数据.图像共享数据的测试privatevo......
  • OpenCV 输出文本
    PutText()输出文本OpenCV5将支持中文字符的输出,当前版本OpenCV4原生不支持,可以使用Contrib包+FreeType方式实现,不过比较麻烦.为了省事,也可以通过将Mat转成bitmap,然后使用GDI方式输出中文字符.示例代码///<summary>///OpenCV暂时不能支持中......
  • Python OpenCV 形态学应用—图像开运算与闭运算
    ✅作者简介:热爱科研的算法开发者,Python、Matlab项目可交流、沟通、学习。......
  • python实现PDF文件指定页码号裁剪
    代码importPyPDF2out_pdf=PyPDF2.PdfFileWriter()dst_file=f'output.pdf'withopen('input.pdf','rb')assrc_file: reader=PyPDF2.PdfFileReader(src_file) pages=reader.numPages forpinrange(12): #这里是获取源PDF前12页,......
  • OpenCV 图像读写和显示
    图像读取ImRead()函数可从文件中读取图像,并生成一个Mat对象,ImRead()函数支持绝大多数图像格式.注意点:读取后生成的Mat对象,颜色空间为BGR,第二参数为读取方式,常用的方式有:.ImreadModes.Color:彩色方式读取,即使原图是4通道或者单通道,生成的Mat永远为三通......
  • QT + OPENCV + OpenCV_contrib + MINGW编译
    参见  QT+OPENCV+OpenCV_contrib+MINGW编译_东方.既白的博客-CSDN博客注意事项:1. opencv不要采用版本太高的,与mingw730_64编译器不兼容。太多错误2. ......