一、cv函数
创新互联坚持“要么做到,要么别承诺”的工作理念,服务领域包括:成都网站设计、网站建设、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的丰镇网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!
1、imread:读取图片
imread(image_path, flag):
images_path:图片路径,找不到不报错
flag:
1/cv2.IMREAD_COLOR:彩色图片,图片透明性会被忽略,默认参数
0/cv2.IMREAD_GRAYSCALE:灰色图片
-1/cv2.IMREAD_UNCHANGED:包括其alpha通道
2、imwrite
imwrite(img_path_name,img)
img_path_name:保存的文件名
img:文件对象
3、cvtColor
cvtColor(img,code)
img: 图像对象
code:
cv2.COLOR_RGB2GRAY: RGB转换到灰度模式
cv2.COLOR_RGB2HSV: RGB转换到HSV模式(hue,saturation,Value)
4、matchTemplate
matchTemplate(img_path, bg_path, cv2.TM_CCOEFF_NORMED)
img_path:对比图片
bg_path:背景图片
cv2.TM_CCOEFF_NORMED
```
# encoding=utf8
import cv2
import numpyas np
def show(name):
cv2.imshow('Show', name)
cv2.waitKey(0)
cv2.destroyAllWindows()
def main():
otemp ='./images/tb.png'
oblk ='./images/bg.jpg'
target = cv2.imread(otemp, 0)
template = cv2.imread(oblk, 0)# 读取到两个图片,进行灰值化处理
w, h = target.shape[::-1]
aa = target.shape
print(aa)
print(w, h)
temp ='./images/temp.jpg'
targ ='./images/targ.jpg'
cv2.imwrite(temp, template)
cv2.imwrite(targ, target)# 处理后进行保存
target = cv2.imread(targ)
target = cv2.cvtColor(target, cv2.COLOR_BGR2GRAY)# 转化到灰度
target =abs(255 - target)# 返回绝对值
cv2.imwrite(targ, target)# 重新写入
target = cv2.imread(targ)
template = cv2.imread(temp)
result = cv2.matchTemplate(target, template, cv2.TM_CCOEFF_NORMED)# 进行匹配
x, y = np.unravel_index(result.argmax(), result.shape)# 通过np转化为数值,就是坐标
print(y, x)
# 展示圈出来的区域
cv2.rectangle(template, (y, x), (y + w, x + h), (7, 249, 151), 2)
show(template)
return y, x
if __name__ =='__main__':
a, b = main()
```
此函数将输入的图片从一个颜色域转换到另一个。
input: 以数组形式输入图片
zoom:浮点数或数组。如果是一个浮点数,对每一个轴放缩相同的倍数。如果是一个数组,则对每一个轴分配一个值。
output:输出,默认为None
order:整型(范围0-5)样条插值的顺序,默认为3。详见后续
mode:字符串,包括{‘reflect’, ‘constant’, ‘nearest’, ‘mirror’, ‘wrap’},输入的数组如何扩展边界,默认为 ‘constant'(具体参考官方文档 插值的边界处理 )
cval:浮点数,当插值的边界处理模式为’constant‘时发挥作用。默认为0.0
prefilter:bool,input输入的数组是否经过一个预样条滤波器,默认为True
设原图 ,
目标图片
设 之比为 , ,则:
设原图坐标上的像素点 ,
目标图片坐标上的像素的为
1.计算目标图片的坐标点对应原图中哪个坐标点,公式为:
2.根据dst_x,dst_y的值四舍五入为整数,填充到目标图片的相应位置。
由上图可以看到,经过转换后的图片出现了锯齿感。
1.计算目标图片的坐标点对应原图中哪个坐标点(此步与最邻近插值算法相同),公式为:
2.由于点 是个浮点数坐标,无法用整型的灰度值或RGB值来表示,因此双线性插值算法通过寻找距离这个对应坐标最近的四个像素点,来计算该点的值(灰度值或者RGB值)。
设分解后的坐标为:
首先,在x方向上进行线性插值, 代表该点的像素值。
然后,在y方向上进行线性插值:
得到的 就是该点经过处理后的像素值,填充到目标图片的相应位置。
可见,双线性插值算法的锯齿感要少于最邻近插值法。
三次插值法(cubic interpolation method)是一种 多项式插值法 ,逐次以 三次曲线 φ(t)=a 0 +a 1 t+a 2 t 2 +a 3 t 3 的极小点逼近寻求函数f(t)的极小点的一种方法.(摘自 百度百科 )
可见,三次插值法处理后的图片几乎没有锯齿感
1. PIL.Image.open
代码在这里:Pillow/Image.py at 3.1.x · python-pillow/Pillow · GitHub
open() 函数打开图像,但并不读入,直到有操作发生。
具体的读取操作是在 ImageFile.py 写的。大体流程是先检测文件类型,整块地读入文件内容,然后调用解码器解码,做了很多优化,效率应该还是很高的。
2. scipy.ndimage.imread
代码在这里:scipy/io.py at v0.17.1 · scipy/scipy · GitHub
imread 调用 scipy.misc.pilutil.imread。从名字就能看出来其实调用的还是 Pillow。
根据 pilutil 代码:scipy/pilutil.py at v0.17.1 · scipy/scipy · GitHub
确实是调用 pil.image.open(),然后返回一个 fromimage()。
3. scipy.misc.imread
misc 的 __init__.py 在这里:scipy/__init__.py at v0.17.1 · scipy/scipy · GitHub
调用的还是 pilutil 中的 imread
相关代码如下
try:
from .pilutil import *
from . import pilutil
__all__ += pilutil.__all__
del pilutil
except ImportError:
pass
也算是学了一招,从 pilutil 导入其所有函数添加到当前空间,然后又删除了 pilutil 消除影响。
4. skimage.io.imread
代码在这里:scikit-image/_io.py at master · scikit-image/scikit-image · GitHub
是通过插件 plugin 来读入不同的文件,而且会试用几个不同的 plugins 来找到合适的。
使用 call_plugin 来调用,代码在这里:scikit-image/manage_plugins.py at master · scikit-image/scikit-image · GitHub
可以根据如下代码查看插件调用的优先级
# For each plugin type, default to the first available plugin as defined by
# the following preferences.
preferred_plugins = {
# Default plugins for all types (overridden by specific types below).
'all': ['pil', 'matplotlib', 'qt', 'freeimage'],
'imshow': ['matplotlib'],
'imshow_collection': ['matplotlib']
}
plugins 的源代码在这里:scikit-image/skimage/io/_plugins at master · scikit-image/scikit-image · GitHub。可以看到 pil 的 imread,是用 open 打开图像之后,再转换成 ndarray。
5. cv2.imread
这里是调用的 CV::imread(),代码在这里:opencv/loadsave.cpp at master · opencv/opencv · GitHub。一般来说 C\C++ 的实现,应该比 python 速度快一点。
6. matplotlib.image.imread
matplotlib 的文档里面说,matplotlib 原生只可以读取 PNG 文件,有 PIL 的时候,可以读取其他类型的文件。如果使用 URL 打开在线图像文件,需要符合 PIL 的文档要求。
matplotlib.image.imread 的代码在这里:matplotlib/image.py at master · matplotlib/matplotlib · GitHub。matplotlib 的原生 PNG 读取和写入,是用 C 实现的,代码在这里:matplotlib/_png.cpp at master · matplotlib/matplotlib · GitHub。
matplotlib 是先用 pil 的 open 打开图像,如果格式是 png,就用原生方法打开。相关代码如下:
handlers = {'png': _png.read_png, }
if format is None:
if cbook.is_string_like(fname):
parsed = urlparse(fname)
# If the string is a URL, assume png
if len(parsed.scheme) 1:
ext = 'png'
else:
basename, ext = os.path.splitext(fname)
ext = ext.lower()[1:]
elif hasattr(fname, 'name'):
basename, ext = os.path.splitext(fname.name)
ext = ext.lower()[1:]
else:
ext = 'png'
else:
ext = format
if ext not in handlers:
im = pilread(fname)
if im is None:
raise ValueError('Only know how to handle extensions: %s; '
'with Pillow installed matplotlib can handle '
'more images' % list(six.iterkeys(handlers)))
return im
声明的处理器只有 png。如果是 png 文件,调用 _png.read_png。如果不是 png 直接使用 pilread(就是用 pil 的 Image.open 然后 pil_to_array)。
matplotlib 的源码确实比较复杂,一大部分主体是用 C 写的,改动很激进,功能更新猛烈。
因为验证码图片是禁止缓存的 ,当然无法用缓存函数获取了。 解决方法有很多。可以用同样的会话再次请求得到图片。
1、需要用到其他模块的函数,如:
for i in range(20) #循环次数
image=cv2.imread("D:\\picture\\%d.jpg"%(i))#路径自己选择。
2、可以先升级你的pip,另外看看你的版本是否匹配,包括py版本和32位64位。
3、关于python下使用opencv读取图像。首先需要导入opencv包,上面说的那个Ipython并没有opencv包,所以想使用的请先正确导入opencv包再说,至于怎么导入,先下载个opencv包,里面有关于python的opencv包。
以下照片是关于Ipython的运行界面:
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 库做图像处理
来自