当前位置:   article > 正文

(3-2)OpenCV图像视觉处理:OpenCV-Python图像操作_python opencv 读图

python opencv 读图

在本节的内容中,首先学习读取图像、显示图像以及保存图像的知识,然后讲解绘图、图像算法和几何变换的知识。

3.2.1  读取并显示图像

1. 读取图像

OpenCV-Python中,使用内置函数cv.imread()读取图像,被读取的图像应该在工作目录中,或使用图像的完整路径。函数cv.imread()的语法格式如下:

cv2.imread(filepath,flags)

(1)filepath:表示要读入图片的完整路径

(2)flags:读入图片的标志,用于设置读取图像的方式,主要方式有:

  1. cv.IMREAD_COLOR: 加载彩色图像,用整数1表示。任何图像的透明度都会被忽视,这是是默认标志值;
  2. cv.IMREAD_GRAYSCALE:以灰度模式加载图像,用整数0表示;
  3. cv.IMREAD_UNCHANGED:加载图像,包括alpha通道,用-1表示;

2. 显示图像

OpenCV-Python中,使用内置函数cv.imshow()在窗口中显示图像,窗口会自动适合图像的尺寸大小。函数cv.imshow()的语法格式如下:

cv.imshow(winname, mat)

  1. 参数winname表示窗口名称,是一个字符串。
  2. 参数mat表示我们要显示的图像对象,我们可以根据需要创建任意多个窗口,但可以使用不同的窗口名称。

下面的实例文件cv01.py中,演示了使用OpenCV-Python读取并显示指定图像的过程。

实例3-1:读取并显示指定的图像

源码路径:daima\3\cv01.py

  1. import cv2 as cv
  2. print( cv.__version__ )
  3. #加载彩色灰度图像
  4. img = cv.imread('111.jpg',0)
  5. cv.imshow('image',img)
  6. cv.waitKey(0)
  7. cv.destroyAllWindows()
  1. cv.__version__ 的功能是显示当前安装的OpenCV-Python的版本。
  2. cv.imread('111.jpg',0)的功能是用灰度模式加载图片111.jpg,最后通过函数imshow('image',img)显示图片111.jpg。
  3. cv.waitKey()是一个键盘绑定函数。其参数是以毫秒为单位的时间。该函数等待任何键盘事件指定的毫秒。如果您在这段时间内按下任何键,程序将继续运行。如果**0**被传递,它将无限期地等待一次敲击键。它也可以设置为检测特定的按键,例如按下键a等。
  4. cv.destroyAllWindows()会破坏我们创建的所有窗口,如果要销毁任何特定的窗口,请使用函数 cv.destroyWindow()在其中传递确切的窗口名称作为参数。

执行效果如图3-1所示

图3-1  执行效果

注意:在特殊情况下,可以创建一个空窗口,然后再将图像加载到该窗口。在这种情况下,可以指定窗口是否可调整大小,这是通过功能函数cv.namedWindow()实现的。在默认情况下,该标志为cv.WINDOW_AUTOSIZE。但是,如果将标志指定为cv.WINDOW_NORMAL,则可以调整窗口大小。当图像尺寸过大以及向窗口添加跟踪栏时,这将很有帮助。例如下面的代码:

  1. cv.namedWindow('image',cv.WINDOW_NORMAL)
  2. cv.imshow('image',img)
  3. cv.waitKey(0)
  4. cv.destroyAllWindows()

3.2.2  保存图像

OpenCV-Python中,使用内置函数cv.imwrite()保存图像。例如:

cv.imwrite('messigray.png',img)

其中第一个参数表示需要保存图像的文件名,要保存图片为哪种格式,就带什么后缀。第二个参数表示保存的图像,功能是将图像以PNG格式保存在工作目录中。

例如在下面的实例中,先准备一幅彩色图像文件111.jpg。然后以灰度模式加载并显示图像文件111.jpg,按下S键后将灰度文件保存为new.png并退出,或者按ESC键直接退出而不保存。

实例3-2以灰度模式加载、显示、保存图像

源码路径:daima\3\cv02py

  1. import cv2 as cv
  2. img = cv.imread('111.jpg',0)
  3. cv.imshow('image',img)
  4. k = cv.waitKey(0)
  5. if k == 27:         # 等待ESC退出
  6.     cv.destroyAllWindows()
  7. elif k == ord('s'): # 等待关键字,保存和退出
  8.     cv.imwrite('new.png',img)
  9.     cv.destroyAllWindows()

执行效果如图3-2所示

图3-2  执行效果

3.2.3  在Matplotlib中显示图像

在Python程序中,经常使用Matplotlib实现绘图功能,例如数据可视化中的统计图。在使用OpenCV-Python显示图像时可以借助于Matplotlib缩放图像货保存图像。例如在下面的实例中,在Matplotlib中使用OpenCV-Python显示了一幅指定的图像

实例3-3在Matplotlib中使用OpenCV-Python显示了一幅指定的图像

源码路径:daima\3\cv03.py

  1. import cv2 as cv
  2. from matplotlib import pyplot as plt
  3. img = cv.imread('111.jpg',0)
  4. plt.imshow(img, cmap = 'gray', interpolation = 'bicubic')
  5. plt.xticks([]), plt.yticks([]) # 隐藏 x 轴和 y 轴上的刻度值
  6. plt.show()

执行效果如图3-3所示

图3-3  执行效果

3.2.4  绘图

在OpenCV-Python绘图应用中经常用到的内置函数有cv.line()、cv.circle()、cv.rectangle()、cv.ellipse()和cv.putText()等,这些函数的的常用参数有:

  1. img:表示要绘制形状的图像
  2. color:形状的颜色。对于BGR模式来说,将使用元组设置颜色,例如用(255,0,0)设置为蓝色。对于灰度模式来说,只需使用标量值设置即可。
  3. 厚度:线或圆等的粗细,默认值为1。如果对闭合图形(如圆)传递-1,它将填充形状。
  4. lineType:线的类型,例如8连接线、抗锯齿线等。在默认情况下为8连接线。

(1)画直线

在OpenCV-Python中使用内置函数cv.line()绘制一条线,在绘制时需要设置开始坐标和结束坐标。例如在下面的实例中,演示了在OpenCV-Python中绘制直线的过程

实例3-4在OpenCV-Python图像中绘制直线

源码路径:daima\3\cv04.py

  1. import cv2 as cv
  2. # 创建黑色的图像
  3. img = cv.imread('111.jpg',1)
  4. # 绘制一条厚度为5的蓝色对角线
  5. cv.line(img,(0,0),(511,511),(255,0,0),5)
  6. #显示图像
  7. cv.imshow('image',img)
  8. cv.waitKey(0)

在上述代码中(0,0)表示起点(511,511)表示终点(255,0,0)表示线的颜色5表示线的宽度。执行效果如图3-4所示

(2)画矩形

在OpenCV-Python中使用内置函数cv.rectangle()绘制矩形,在绘制时需要矩形的左上角和右下角。请看下面的代码,将在图像img的右上角绘制一个绿色矩形。

cv.rectangle(img,(384,0),(510,128),(0,255,0),3)

(3)画圆

在OpenCV-Python中使用内置函数cv.circle()绘制圆,在绘制时需要设置圆的中心坐标和半径。例如:

cv.circle(img,(447,63), 63, (0,0,255), -1)

(4)画椭圆

在OpenCV-Python中使用内置函数cv.ellipse()绘制椭圆,在绘制时需要传递如下参数:

  1. 中心位置参数(x,y)
  2. 轴长度参数(长轴长度,短轴长度)。
  3. Angle角度参数,是椭圆沿逆时针方向旋转的角度。startAngle和endAngle分别表示从主轴沿顺时针方向测量的椭圆弧的开始和结束。即给出0和360给出完整的椭圆。

例如下面的代码绘制了一个椭圆:

cv.ellipse(img,(256,256),(100,50),0,0,180,255,-1)

(5)画多边形

在OpenCV-Python中使用内置函数cv.polylines()绘制多边形,在绘制时时首先需要设置顶点坐标,将这些点组成形状为ROWS*1*2的数组,其中ROWS是顶点数,并且其类型应为int32。例如下面绘制了一个带有四个顶点的黄色小多边形。

  1. pts = np.array([[10,5],[20,30],[70,20],[50,10]], np.int32)
  2. pts = pts.reshape((-1,1,2))
  3. cv.polylines(img,[pts],True,(0,255,255))

注意,如果函数cv.polylines()的第三个参数为False,将获得一条连接所有点的折线,而不是闭合形状。

(6)绘制文本:

在图像中绘制文本时需要设置多个内容参数,例如要写入的文字数据、要放置它的位置坐标(即数据开始的左下角)、字体类型、字体比例(指定字体大小)、例如颜色、厚度、线条类型等。为了获得更好的外观,建议使用lineType = cv.LINE_AA。请看下面的代码,将在白色图像上绘制文字“OpenCV”。

  1. font = cv.FONT_HERSHEY_SIMPLEX
  2. cv.putText(img,'OpenCV',(10,500), font, 4,(255,255,255),2,cv.LINE_AA)

请看下面的实例,我们将对上面的代码进行总结,演示使用OpenCV-Python中绘制常见图形的过程

实例3-5绘制常见的图形

源码路径:daima\3\cv05.py

  1. import numpy as np
  2. import cv2 as cv
  3. # 创建黑色的图像
  4. img = np.zeros((512,512,3), np.uint8)
  5. # 绘制一条厚度为5的蓝色对角线
  6. cv.line(img,(0,0),(511,511),(255,0,0),5)
  7. cv.rectangle(img,(384,0),(510,128),(0,255,0),3)
  8. cv.circle(img,(447,63), 63, (0,0,255), -1)
  9. cv.ellipse(img,(256,256),(100,50),0,0,180,255,-1)
  10. pts = np.array([[10,5],[20,30],[70,20],[50,10]], np.int32)
  11. pts = pts.reshape((-1,1,2))
  12. cv.polylines(img,[pts],True,(0,255,255))
  13. font = cv.FONT_HERSHEY_SIMPLEX
  14. cv.putText(img,'OpenCV',(10,500), font, 4,(255,255,255),2,cv.LINE_AA)
  15. #显示图像
  16. cv.imshow('image',img)
  17. cv.waitKey(0)

执行效果如图3-5所示

图3-5  执行效果

3.2.5  将鼠标作为画笔

在使用电脑绘图时通常将鼠标作为画笔。假设我们即将创建一个应用程序,要求在双击鼠标后可以在图像上绘制一个圆。为了实现这个功能,首先创建一个鼠标回调函数,该函数在发生鼠标事件时执行。鼠标事件可以是与鼠标相关的任何事物,例如左键按下,左键按下,左键双击等。它为我们提供了每个鼠标事件的坐标(x,y)。通过此活动和地点,我们可以做任何我们喜欢的事情。通过如下Python代码,可以输出显示所有可用的鼠标事件。

  1. import cv2 as cv
  2. events = [i for i in dir(cv) if 'EVENT' in i]
  3. print( events )

在作者的电脑中执行后会输出显示OpenCV-Python支持的鼠标事件

['EVENT_FLAG_ALTKEY', 'EVENT_FLAG_CTRLKEY', 'EVENT_FLAG_LBUTTON', 'EVENT_FLAG_MBUTTON', 'EVENT_FLAG_RBUTTON', 'EVENT_FLAG_SHIFTKEY', 'EVENT_LBUTTONDBLCLK', 'EVENT_LBUTTONDOWN', 'EVENT_LBUTTONUP', 'EVENT_MBUTTONDBLCLK', 'EVENT_MBUTTONDOWN', 'EVENT_MBUTTONUP', 'EVENT_MOUSEHWHEEL', 'EVENT_MOUSEMOVE', 'EVENT_MOUSEWHEEL', 'EVENT_RBUTTONDBLCLK', 'EVENT_RBUTTONDOWN', 'EVENT_RBUTTONUP']'
运行

请看下面的实例,功能是创建一个矩形画布,当双击鼠标左键时调用函数draw_circle()绘制一个指定样式的圆

实例3-6绘制一个指定样式的圆

源码路径:daima\3\cv06.py

  1. import numpy as np
  2. import cv2 as cv
  3. # 鼠标回调函数
  4. def draw_circle(event,x,y,flags,param):
  5. if event == cv.EVENT_LBUTTONDBLCLK:
  6. cv.circle(img,(x,y),100,(222,220,0),-1)
  7. # 创建一个黑色的图像,一个窗口,并绑定到窗口的功能
  8. img = np.zeros((512,512,3), np.uint8)
  9. cv.namedWindow('image')
  10. cv.setMouseCallback('image',draw_circle)
  11. while(1):
  12. cv.imshow('image',img)
  13. if cv.waitKey(20) & 0xFF == 27:
  14. break
  15. cv.destroyAllWindows()

执行效果如图3-6所示

图3-6  当双击鼠标左键时绘制圆

3.2.6  调色板程序

在OpenCV-Python中使用内置函数cv.getTrackbarPos()创建滑块,例如:

cv.createTrackbar('R','image',0,255,nothing)

在函数cv.getTrackbarPos()中,第一个参数表示滑块的名称,第二个参数是滑块附加到的窗口的名称,第三个参数是默认值,第四个参数是最大值,第五个是执行的回调函数每次跟踪栏值更改。

在下面的实例中,使用内置函数cv.getTrackbarPos()创建滑块,通过滑块可以设置屏幕的颜色。执行后先显示设置颜色窗口,以及三个用于指定B、G、R颜色的跟踪栏。通过滑动滑块可以相应地更改窗口的颜色。在默认情况下,初始颜色将设置为黑色。

实例3-7通过滑块设置屏幕的颜色

源码路径:daima\3\cv07.py

  1. import numpy as np
  2. import cv2 as cv
  3. def nothing(x):
  4. pass
  5. # 创建一个黑色的图像,一个窗口
  6. img = np.zeros((300,512,3), np.uint8)
  7. cv.namedWindow('image')
  8. # 创建颜色变化的轨迹栏
  9. cv.createTrackbar('R','image',0,255,nothing)
  10. cv.createTrackbar('G','image',0,255,nothing)
  11. cv.createTrackbar('B','image',0,255,nothing)
  12. # 为 ON/OFF 功能创建开关
  13. switch = '0 : OFF \n1 : ON'
  14. cv.createTrackbar(switch, 'image',0,1,nothing)
  15. while(1):
  16. cv.imshow('image',img)
  17. k = cv.waitKey(1) & 0xFF
  18. if k == 27:
  19. break
  20. # 得到四条轨迹的当前位置
  21. r = cv.getTrackbarPos('R','image')
  22. g = cv.getTrackbarPos('G','image')
  23. b = cv.getTrackbarPos('B','image')
  24. s = cv.getTrackbarPos(switch,'image')
  25. if s == 0:
  26. img[:] = 0
  27. else:
  28. img[:] = [b,g,r]
  29. cv.destroyAllWindows()

在上述代码中,我们创建了一个画笔开关,只有在该开关为ON的情况下,才能使用滑块设置屏幕的颜色,否则屏幕始终为黑色。执行效果如图3-7所示

图3-7  执行效果

3.2.7  基本的属性操作

(1)访问和修改像素值

首先加载一幅指定的彩色图像:

  1. >>> import numpy as np
  2. >>> import cv2 as cv
  3. >>> img = cv.imread('111.jpg')

接下来可以通过行和列坐标来访问图像的像素值。对于BGR图像来说,会返回一个由蓝色、绿色和红色值组成的数组。对于灰度图像来说,只会返回相应的灰度。

  1. >>> px = img[100,100]
  2. >>> print( px )
  3. [157 166 200]
  4. # 仅访问蓝色像素
  5. >>> blue = img[100,100,0]
  6. >>> print( blue )
  7. 157

也可以用相同的方式修改图像的像素值:

  1. >>> img[100,100] = [255,255,255]
  2. >>> print( img[100,100] )
  3. [255 255 255]

也可以用下面方法访问和修改像素值:

  1. # 访问 RED 值
  2. >>> img.item(10,10,2)
  3. 59
  4. # 修改 RED 值
  5. >>> img.itemset((10,10,2),100)
  6. >>> img.item(10,10,2)
  7. 100

(2)访问图像属性

图像属性包括行数,列数和通道数,图像数据类型,像素数等。在OpenCV-Python中,可以通过img.shape访问图像的形状。img.shape会返回由行、列和通道数组成的元组(如果图像是彩色的),例如:

  1. >>> print( img.shape )
  2. (342, 548, 3)

注意:如果图像是灰度模式,则返回的元组仅包含行数和列数,因此这是检查加载的图像是灰度还是彩色的好方法。

可以通过访问img.size获得图像的像素总数:

  1. >>> print( img.size )
  2. 562248

可以通过img.dtype获得图像的数据类型:

  1. >>> print( img.dtype )
  2. uint8

(3)为图像设置边框(填充)

如果要在图像周围创建边框(如相框),可以使用OpenCV-Python内置函数cv.copyMakeBorder()实现。函数cv.copyMakeBorder()在卷积运算和零填充等方面的应用比较常见,此函数的常用参数如下:

  1. src:要处理的图像
  2. top/bottom/left/right:边界的宽度(以相应方向上的像素数为单位);
  3. borderTyp:定义要添加哪种边框的标志,可以是以下类型:
  1. cv.BORDER_CONSTANT - 添加恒定的彩色边框。该值应作为下一个参数给出。
  2. cv.BORDER_REFLECT - 边框将是边框元素的镜像;
  1. value:边框的颜色。

请看下面的实例,演示了使用函数cv.copyMakeBorder()为图像设置边框的过程。在Matplotlib中,为图像111.jpg设置了多种样式的边框。

实例3-8图像设置多种样式的边框

源码路径:daima\3\cv08.py

  1. import cv2 as cv
  2. import numpy as np
  3. from matplotlib import pyplot as plt
  4. BLUE = [255,0,0]
  5. img1 = cv.imread('111.jpg')
  6. replicate = cv.copyMakeBorder(img1,10,10,10,10,cv.BORDER_REPLICATE)
  7. reflect = cv.copyMakeBorder(img1,10,10,10,10,cv.BORDER_REFLECT)
  8. reflect101 = cv.copyMakeBorder(img1,10,10,10,10,cv.BORDER_REFLECT_101)
  9. wrap = cv.copyMakeBorder(img1,10,10,10,10,cv.BORDER_WRAP)
  10. constant= cv.copyMakeBorder(img1,10,10,10,10,cv.BORDER_CONSTANT,value=BLUE)
  11. plt.subplot(231),plt.imshow(img1,'gray'),plt.title('ORIGINAL')
  12. plt.subplot(232),plt.imshow(replicate,'gray'),plt.title('REPLICATE')
  13. plt.subplot(233),plt.imshow(reflect,'gray'),plt.title('REFLECT')
  14. plt.subplot(234),plt.imshow(reflect101,'gray'),plt.title('REFLECT_101')
  15. plt.subplot(235),plt.imshow(wrap,'gray'),plt.title('WRAP')
  16. plt.subplot(236),plt.imshow(constant,'gray'),plt.title('CONSTANT')
  17. plt.show()

执行效果如图3-8所示

图3-8  执行效果

未完待续

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/空白诗007/article/detail/888110
推荐阅读
相关标签
  

闽ICP备14008679号