python 图像旋转怎么去除黑边去除黑边现象的办法:
1)在做图像坐标映射反查的时候,算出当前点在原始图像的外部还是内部,若在外部 , 判断当前像素点的X或者Y位置,找临近四个边界的像
素值代替;
该方法太过繁琐,适合自己写程序实现 , 如若想调用现有的一些库函数,可以考虑2)做法:
2)将待旋转的图像进行边界填充,最不济的情况下可以扩充为原始图像的大?。?
旋转边界填充图像;
计算原始图像经过旋转以后的结果图像的尺寸大?。?
在边界填充旋转图像上截取目标图像;(图像都是按照图像中心旋转的);
附上一段matlab人脸根据人眼位置对齐的代码:
[plain] view plain copy
eye_angle = atan2( (eye_pts(2,2) - eye_pts(1,2)),(eye_pts(2,1) - eye_pts(1,1) ) ) * 180 / pi; % 人眼的倾斜角度
if eye_angle0
eye_angle = eye_angle360;
end
if floor(eye_angle)= 5|| floor( 360 - eye_angle ) = 5
continue;
end % 5度之内不做对齐操作
img = imread(img_path);
[m,n,~] = size(img);
img_pad = padarray(img,[m n],'both','replicate');% 扩充图像
img_pad_rotate = imrotate(img_pad,eye_angle,'bilinear'); % 旋转扩充图像
[m_pad_r,n_pad_r,~] = size(img_pad_rotate);
[plain] view plain copy
eye_angle = eye_angle * pi / 180;
f_cos = cos(eye_angle);f_sin = sin(eye_angle);
new_m = floor(m * abs(f_cos)n * abs(f_sin));
new_n = floor(n * abs(f_sin)m * abs(f_cos));% 最终对齐图像的大小
left = floor((n_pad_r - new_n) / 2);right = leftnew_n;
bott = floor((m_pad_r - new_m) / 2);up = bottnew_m;
face_rorate = img_pad_rotate(bott : up,left : right,:); % 截取目标图像
figure,imshow(face_rorate)
OpenCV Python实现旋转矩形的裁剪环境
矩形操作是我们在 OpenCV 里最常用的操作,其中最为常见的就是包围框( Bounding Box )和旋转矩形( Rotated Box ) 。其中包围框是最为常见的 , 对应 OpenCV 中的 boundingRect() ,使用正矩形框处物体,一般多用在目标检测中 。使用包围框框柱目标物体 , 这种操作比较简单,但是通常框中也会有一些其他的区域 。其次就是使用旋转矩形,也叫最小外接矩形,对应 OpenCV 中的 minAreaRect(),用来使用旋转矩形最大限度的框出目标物体,减小背景干扰,在 OCR 任务中较为常用 。
minAreaRect() 返回了所需区域的最小斜矩形的参数 , 与包围框直接返回四个顶点的坐标不同,最小外接矩形返回的是矩形的 ((x, y), (w, h), angle),对应了矩形的中心,宽度 , 高度和旋转角度 。
旋转角度 angle 是水平轴( x 轴)逆时针旋转,与碰到的矩形的第一条边的夹角 。并且这个边的边长是 width,另一条边边长是 height。也就是说 , 在这里 width 与 height 不是按照长短来定义的 。
在 OpenCV 中,坐标系原点在左上角,相对于 x 轴 , 逆时针旋转角度为负,顺时针旋转角度为正,所以函数 minAreaRect() 返回的角度范围时 [-90~0)。想象一个平放的长矩形,调用 minAreaRect()返回的角度为 -90 度 。如果我们旋转图像 , 直到矩形树立起来,这是调用 minAreaRect() 得到的角度依然是 -90 度 。
第一种裁剪旋转矩形的方法是通过仿射变换旋转图像的方式 。
仿射变换( Affine Transformation ) 是一种二维坐标到二维坐标之间的线性变换 , 保持二维图形的“平直性”( straightness ,即变换后直线还是直线不会打弯,圆弧还是圆?。┖汀捌叫行浴保?parallelness ,其实是指保二维图形间的相对位置关系不变,平行线还是平行线,相交直线的交角不变 。) 。
计算过程:
如果不做边长和角度的判断 , 则只会沿着 x 轴的顺时针方向做相同大小角度的旋转,不能保证旋转后的视角是正确的视角:
根据任务目标的类型,做边长和角度的判断并进行相应的调整,可以保证旋转后的视角是正确的视角:
第二种裁剪旋转矩形的方法是通过透视变换直接将旋转矩形的四个顶点映射到正矩形的四个顶点 。
透视变换( Perspective Transformation )是将图片投影到一个新的视平面( Viewing Plane ),也称作投影映射( Projective Mapping ) 。
计算过程:
以上两种方法都可以用来抠取旋转矩形的内容 。仿射变换方法需要预先对整张图进行旋转,通过观察旋转后的图像可以发现,有一部分图像被旋转出了图像边界,如果python旋转图形函数你要抠取的目标正好在图像边缘附近,那么很容易出界导致图像抠取的缺失 。同时我们需要对宽、高和角度做出动态的调整python旋转图形函数;透视变换的方法直接对抠取区域进行了映射,这种方法可以省略旋转的步骤,并且不会出现抠取内容的缺失 。同时我们只需要对4个顶点之间的映射关系做好定义即可,不需要考虑角度的问题 。相对的,透视变换相对于仿射变换计算量更大一些 , 不过这在 c的底层实现上带来的时延差距小于 ms。
python:PIL图像处理PIL (Python Imaging Library)
Python图像处理库,该库支持多种文件格式,提供强大的图像处理功能 。
PIL中最重要的类是Image类 , 该类在Image模块中定义 。
从文件加载图像:
如果成功,这个函数返回一个Image对象 。现在你可以使用该对象的属性来探索文件的内容 。
format 属性指定了图像文件的格式 , 如果图像不是从文件中加载的则为 None。
size 属性是一个2个元素的元组 , 包含图像宽度和高度(像素) 。
mode 属性定义了像素格式,常用的像素格式为:“L” (luminance) - 灰度图, “RGB” , “CMYK” 。
如果文件打开失败, 将抛出IOError异常 。
一旦你拥有一个Image类的实例 , 你就可以用该类定义的方法操作图像 。比如:显示
( show() 的标准实现不是很有效率,因为它将图像保存到一个临时文件,然后调用外部工具(比如系统的默认图片查看软件)显示图像 。该函数将是一个非常方便的调试和测试工具 。)
接下来的部分展示了该库提供的不同功能 。
PIL支持多种图像格式 。从磁盘中读取文件,只需使用 Image 模块中的 open 函数 。不需要提供文件的图像格式 。PIL库将根据文件内容自动检测 。
如果要保存到文件,使用 Image 模块中的 save 函数 。当保存文件时,文件名很重要,除非指定格式,否则PIL库将根据文件的扩展名来决定使用哪种格式保存 。
** 转换文件到JPEG **
save 函数的第二个参数可以指定使用的文件格式 。如果文件名中使用了一个非标准的扩展名,则必须通过第二个参数来指定文件格式 。
** 创建JPEG缩略图 **
需要注意的是,PIL只有在需要的时候才加载像素数据 。当你打开一个文件时,PIL只是读取文件头获得文件格式、图像模式、图像大小等属性 , 而像素数据只有在需要的时候才会加载 。
这意味着打开一个图像文件是一个非常快的操作,不会受文件大小和压缩算法类型的影响 。
** 获得图像信息 **
Image 类提供了某些方法,可以操作图像的子区域 。提取图像的某个子区域,使用 crop() 函数 。
** 复制图像的子区域 **
定义区域使用一个包含4个元素的元组,(left, upper, right, lower) 。坐标原点位于左上角 。上面的例子提取的子区域包含300x300个像素 。
该区域可以做接下来的处理然后再粘贴回去 。
** 处理子区域然后粘贴回去 **
当往回粘贴时,区域的大小必须和参数匹配 。另外区域不能超出图像的边界 。然而原图像和区域的颜色模式无需匹配 。区域会自动转换 。
** 滚动图像 **
paste() 函数有个可选参数,接受一个掩码图像 。掩码中255表示指定位置为不透明,0表示粘贴的图像完全透明,中间的值表示不同级别的透明度 。
PIL允许分别操作多通道图像的每个通道 , 比如RGB图像 。split() 函数创建一个图像集合,每个图像包含一个通道 。merge() 函数接受一个颜色模式和一个图像元组,然后将它们合并为一个新的图像 。接下来的例子交换了一个RGB图像的三个通道 。
** 分离和合并图像通道 **
对于单通道图像,split() 函数返回图像本身 。如果想处理各个颜色通道,你可能需要先将图像转为RGB模式 。
resize() 函数接受一个元组 , 指定图像的新大小 。
rotate() 函数接受一个角度值,逆时针旋转 。
** 基本几何变换 **
图像旋转90度也可以使用 transpose() 函数 。transpose() 函数也可以水平或垂直翻转图像 。
** transpose **
transpose() 和 rotate() 函数在性能和结果上没有区别 。
更通用的图像变换函数为 transform()。
PIL可以转换图像的像素模式 。
** 转换颜色模式 **
PIL库支持从其他模式转为“L”或“RGB”模式 , 其他模式之间转换,则需要使用一个中间图像,通常是“RGB”图像 。
ImageFilter 模块包含多个预定义的图像增强过滤器用于 filter() 函数 。
** 应用过滤器 **
point() 函数用于操作图像的像素值 。该函数通常需要传入一个函数对象 , 用于操作图像的每个像素:
** 应用点操作 **
使用以上技术可以快速地对图像像素应用任何简单的表达式 。可以结合 point() 函数和 paste 函数修改图像 。
** 处理图像的各个通道 **
注意用于创建掩码图像的语法:
Python计算逻辑表达式采用短路方式 , 即:如果and运算符左侧为false,就不再计算and右侧的表达式,而且返回结果是表达式的结果 。比如 a and b 如果a为false则返回a,如果a为true则返回b,详见Python语法 。
对于更多高级的图像增强功能,可以使用 ImageEnhance 模块中的类 。
可以调整图像对比度、亮度、色彩平衡、锐度等 。
** 增强图像 **
PIL库包含对图像序列(动画格式)的基本支持 。支持的序列格式包括 FLI/FLC 、 GIF 和一些实验性的格式 。TIFF 文件也可以包含多个帧 。
当打开一个序列文件时 , PIL库自动加载第一帧 。你可以使用 seek() 函数 tell() 函数在不同帧之间移动 。
** 读取序列 **
如例子中展示的 , 当序列到达结尾时,将抛出EOFError异常 。
注意当前版本的库中多数底层驱动只允许seek到下一帧 。如果想回到前面的?。?只能重新打开图像 。
以下迭代器类允许在for语句中循环遍历序列:
** 一个序列迭代器类 **
PIL库包含一些函数用于将图像、文本打印到Postscript打印机 。以下是一个简单的例子 。
** 打印到Postscript **
如前所述,可以使用 open() 函数打开图像文件,通常传入一个文件名作为参数:
如果打开成功 , 返回一个Image对象,否则抛出IOError异常 。
也可以使用一个file-like object代替文件名(暂可以理解为文件句柄) 。该对象必须实现read,seek,tell函数,必须以二进制模式打开 。
** 从文件句柄打开图像 **
如果从字符串数据中读取图像,使用StringIO类:
** 从字符串中读取 **
如果图像文件内嵌在一个大文件里,比如 tar 文件中 。可以使用ContainerIO或TarIO模块来访问 。
** 从tar文档中读取 **
** 该小节不太理解,请参考原文 **
有些解码器允许当读取文件时操作图像 。通常用于在创建缩略图时加速解码(当速度比质量重要时)和输出一个灰度图到激光打印机时 。
draft() 函数 。
** Reading in draft mode **
输出类似以下内容:
注意结果图像可能不会和请求的模式和大小匹配 。如果要确保图像不大于指定的大?。?请使用 thumbnail 函数 。
Python2.7 教程 PIL
Python 之 使用 PIL 库做图像处理
来自
python前视图转换为俯视图想要把前视图转化为鸟瞰图,有两种做法
1.在没有标定python旋转图形函数的情况下,只能选取四个点对python旋转图形函数了
在有标定的情况下,可以直接使用标定的参数
这里主要介绍1
1.没有标定的情况下 , 主要用到了两个函数
M = cv2.getPerspectiveTransform(src, dst)
warped = cv2.warpPerspective(img, M, (img.shape[1], img.shape[0]1080))
cv2.getPerspectiveTransform 从四个点对中计算透视变换,返回值为3*3的透视变换矩阵
cv2.warpPerspective 计算透视变换后的图像
这里自己遇到的坑是,在计算透视变换矩阵的时候 , 怎么获取那四个点对 , 翻了很多blog,都没搞清,最后认认真真的找了一个认认真真的阅读之后,总算摸到门道了,有了一种融会贯通的感觉 。
现在的目标是将图像由前视图转化为鸟瞰图,根据先验知识,在鸟瞰图下,长方形物体显示出来肯定是长方形,因此,python旋转图形函数我们只要在前视图中找到一个正方形的物体,并指定他在俯视图中的坐标就可以了,这里有个但是,由于先验信息里面只有矩形这个信息 , 具体的长宽比什么的 , 以及实际的大小未知,所以转化到鸟瞰图下并不能反应物体的真实长度 。
这里怎么定义转化后的坐标要自己把握
790ec7dc8aa1
原图
比如说转化到黄色的坐标(内接矩形) , 这时候就会内缩,图像出现黑边
790ec7dc8aa1
转化到黄色坐标
如果转化到蓝色的,那么能看到的方位就很小了 , 只有当前车道了(外接矩形)
790ec7dc8aa1
转化到蓝色坐标
dst的坐标也可以自己写,想要转成多大的图像也可以自己填
比如说根据车道的宽度和虚线的长度 , 可以大概估算出实际长宽比 , 一个车道宽度为3.75米 这种城市道路一般虚线是两米,间隔4米(高速一般是69,也就是15米)大概估计一下,高度是12米,也就是说长宽比为12:7,想要显示出4个车道,图像的宽度为1920,折算了一下,目标图像的坐标大概是(这里要注意 , 图像的坐标是从左上角开始算的)
790ec7dc8aa1
自定义
坐标定义代码python旋转图形函数:
src = https://www.04ip.com/post/np.float32([(1242,1949),(1961,1949), (2695, 2542), (133, 2542)])
#内接矩形
dst = np.float32([(1242, 1949), (1961, 1949), (1961, 2542), (1242, 2542)])
#外接矩形
dst = np.float32([(132, 1949), (2695, 1949), (2695, 2542), (133, 2542)])
#自定义
dst = np.float32([(480,1560-1080), (1440,1560-1080), (1440,3096-1080), (480,3096-1080)])
2.使用标定参数来转化
这个转化就是真实的了,因为知道相机的内参,还有相机的pitch角以及相机距离地面的高度
matlab里面转的,要标定的参数
可以参考的透视变换
python图像处理初学者求助Pillow是Python里的图像处理库(PIL:Python Image Library),提供了了广泛的文件格式支持 , 强大的图像处理能力,主要包括图像储存、图像显示、格式转换以及基本的图像处理操作等 。
1)使用 Image 类
PIL最重要的类是 Image class, 你可以通过多种方法创建这个类的实例;你可以从文件加载图像 , 或者处理其他图像, 或者从 scratch 创建 。
要从文件加载图像,可以使用open( )函数 , 在Image模块中:
1
2
from PIL import Image
im = Image.open("E:/photoshop/1.jpg")
加载成功后,将返回一个Image对象,可以通过使用示例属性查看文件内容:
1
2
3
print(im.format, im.size, im.mode)
('JPEG', (600, 351), 'RGB')
format 这个属性标识了图像来源 。如果图像不是从文件读取它的值就是None 。size属性是一个二元tuple , 包含width和height(宽度和高度,单位都是px) 。mode 属性定义了图像bands的数量和名称,以及像素类型和深度 。常见的modes 有 “L” (luminance) 表示灰度图像, “RGB” 表示真彩色图像, and “CMYK” 表示出版图像 。
如果文件打开错误,返回 IOError 错误 。
只要你有了 Image 类的实例,你就可以通过类的方法处理图像 。比如 , 下列方法可以显示图像:
1
im.show()
2)读写图像
PIL 模块支持大量图片格式 。使用在 Image 模块的 open() 函数从磁盘读取文件 。你不需要知道文件格式就能打开它 , 这个库能够根据文件内容自动确定文件格式 。要保存文件 , 使用 Image 类的 save() 方法 。保存文件的时候文件名变得重要了 。除非你指定格式,否则这个库将会以文件名的扩展名作为格式保存 。
加载文件,并转化为png格式:
1
2
3
4
5
6
7
8
9
10
11
12
13
"Python Image Library Test"
from PIL import Image
import os
import sys
for infile in sys.argv[1:]:
f,e = os.path.splitext(infile)
outfile = f".png"
if infile != outfile:
try:
Image.open(infile).save(outfile)
except IOError:
print("Cannot convert", infile)
save() 方法的第二个参数可以指定文件格式 。
3)创建缩略图
缩略图是网络开发或图像软件预览常用的一种基本技术,使用Python的Pillow图像库可以很方便的建立缩略图,如下:
1
2
3
4
5
6
7
# create thumbnail
size = (128,128)
for infile in glob.glob("E:/photoshop/*.jpg"):
f, ext = os.path.splitext(infile)
img = Image.open(infile)
img.thumbnail(size,Image.ANTIALIAS)
img.save(f ".thumbnail","JPEG")
上段代码对photoshop下的jpg图像文件全部创建缩略图,并保存 , glob模块是一种智能化的文件名匹配技术,在批图像处理中经常会用到 。
注意:Pillow库不会直接解码或者加载图像栅格数据 。当你打开一个文件,只会读取文件头信息用来确定格式 , 颜色模式,大小等等 , 文件的剩余部分不会主动处理 。这意味着打开一个图像文件的操作十分快速,跟图片大小和压缩方式无关 。
4)图像的剪切、粘贴与合并操作
Image 类包含的方法允许你操作图像部分选区,PIL.Image.Image.crop 方法获取图像的一个子矩形选区 , 如:
1
2
3
4
# crop, paste and merge
im = Image.open("E:/photoshop/lena.jpg")
box = (100,100,300,300)
region = im.crop(box)
矩形选区有一个4元元组定义 , 分别表示左、上、右、下的坐标 。这个库以左上角为坐标原点,单位是px,所以上诉代码复制了一个 200×200 pixels 的矩形选区 。这个选区现在可以被处理并且粘贴到原图 。
1
2
region = region.transpose(Image.ROTATE_180)
im.paste(region, box)
当你粘贴矩形选区的时候必须保证尺寸一致 。此外,矩形选区不能在图像外 。然而你不必保证矩形选区和原图的颜色模式一致,因为矩形选区会被自动转换颜色 。
5)分离和合并颜色通道
对于多通道图像,有时候在处理时希望能够分别对每个通道处理,处理完成后重新合成多通道 , 在Pillow中,很简单,如下:
1
2
r,g,b = im.split()
im = Image.merge("RGB", (r,g,b))
对于split( )函数,如果是单通道的,则返回其本身,否则,返回各个通道 。
6)几何变换
对图像进行几何变换是一种基本处理,在Pillow中包括resize( )和rotate( ),如用法如下:
1
2
out = im.resize((128,128))
out = im.rotate(45)# degree conter-clockwise
其中,resize( )函数的参数是一个新图像大小的元祖 , 而rotate( )则需要输入顺时针的旋转角度 。在Pillow中,对于一些常见的旋转作了专门的定义:
1
2
3
4
5
out = im.transpose(Image.FLIP_LEFT_RIGHT)
out = im.transpose(Image.FLIP_TOP_BOTTOM)
out = im.transpose(Image.ROTATE_90)
out = im.transpose(Image.ROTATE_180)
out = im.transpose(Image.ROTATE_270)
7)颜色空间变换
在处理图像时,根据需要进行颜色空间的转换 , 如将彩色转换为灰度:
1
2
cmyk = im.convert("CMYK")
gray = im.convert("L")
8)图像滤波
python散点图横坐标文字倾斜在 python 中使用 matplotlib 绘制散点图时python旋转图形函数 , 可以使用 xtick.set_rotation() 函数来设置 x 轴刻度标签的旋转角度 。例如,要将 x 轴刻度标签倾斜 45 度,可以使用以下代码:
Copy code
import matplotlib.pyplot as plt
# 绘制散点图
plt.scatter(x, y)
# 获取 x 轴的刻度对象
xticks = plt.gca().get_xticks()
# 设置 x 轴刻度标签的旋转角度
plt.gca().set_xticklabels(xticks, rotation=45)
# 显示图形
plt.show()
在这段代码中,python旋转图形函数我们使用 plt.scatter() 函数绘制散点图,然后使用 plt.gca().get_xticks() 函数获取 x 轴的刻度对象 。接着,我们使用 plt.gca().set_xticklabels() 函数设置 x 轴刻度标签的旋转角度,最后使用 plt.show() 函数显示图形 。
注意:在调用 plt.scatter() 函数之前,需要先设置 x 和 y 轴的数据 。
【python旋转图形函数 python 旋转】关于python旋转图形函数和python 旋转的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。
推荐阅读
- 美国g口服务器的优势,美国服务器gia
- 文件夹怎么移到另一台电脑,文件夹怎么移动到另一个盘
- id= jquery,jqueryid选择器获取动态id
- go语言零拷贝传输文件 go语言写入文件
- html5设置头部描述信息,html的头部元素
- 虚拟空间ipad,虚拟空间应用程序
- 海宁电视怎么绑定路由器,智能电视怎么连接路由器的无线网
- vb.net窗体最大化 vb窗体最大化最小化
- sapmdm主数据管理,sap主数据维护