首页 > 编程语言 >opencv-python学习之旅

opencv-python学习之旅

时间:2022-12-28 21:56:48浏览次数:64  
标签:之旅 img python cv2 opencv shape 图像 cv 255

opencv-python 操作


*注:在此笔记中只记录下各种函数的使用,规则
详细讲解见https://opencv.apachecn.org/#/docs/4.0.0/2.1-tutorial_py_image_display

创建,读取,显示,保存图像

创建图像

import numpy as np
img = np.zeros((512,512,3),np.uint8)  # 创建一个图像 ,3 是指三个通道,可传入RGB

读取图像

cv2.imread(“本工作目录下的文件名”,-1或0或1) # -1:加载图像,包括alpha通道,0:灰色模式加载图像,1:默认正常模式加载

显示图像

cv.imshow('image', img)   # imshow("窗口名字",要显示的图像)
cv.waitKey(0)
cv.destroyAllWindows()

cv.waitKey() 是一个键盘绑定函数,它的参数是以毫秒为单位的时间。该函数为任意键盘事件等待指定毫秒。如果你在这段时间内按下任意键,程序将继续。如果传的是 0,它会一直等待键盘按下。它也可以设置检测特定的击键,例如,按下键 a 等,我们将在下面讨论。

Note

除了绑定键盘事件,该函数还会处理许多其他 GUI 事件,因此你必须用它来实际显示图像。
cv.destroyAllWindows() 简单的销毁我们创建的所有窗口。如果你想销毁任意指定窗口,应该使用函数 cv.destroyWindow() 参数是确切的窗口名。

eg.下面的程序以灰度模式读取图像,显示图像,如果你按下 's‘ 会保存和退出图像,或者按下 ESC 退出不保存。

import numpy as np
import cv2 as cv

img = cv.imread('messi5.jpg',0)
cv.imshow('image',img)
k = cv.waitKey(0)
if k == 27: # ESC 退出
    cv.destroyAllWindows()
elif k == ord('s'): # 's' 保存退出
    cv.imwrite('messigray.png',img)
    cv.destroyAllWindows()

Note

有一种特殊情况,你可以先创建一个窗口然后加载图像到该窗口。在这种情况下,你能指定窗口是否可调整大小。它是由这个函数完成的 cv.namedWindow()。默认情况下,flag 是 cv.WINDOW_AUTOSIZE。但如果你指定了 flag 为 cv.WINDOW_NORMAL,你能调整窗口大小。当图像尺寸太大,在窗口中添加跟踪条是很有用的。

看下面的代码:

cv.namedWindow('image', cv.WINDOW_NORMAL)
cv.imshow('image',img)
cv.waitKey(0)
cv.destroyAllWindows()

保存图像

保存图像,用这个函数 cv.imwrite()

第一个参数是文件名,第二个参数是你要保存的图像。

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

将该图像用 PNG 格式保存在工作目录。

使用 Matplotlib

Matplotlib 是一个 Python 的绘图库,提供了丰富多样的绘图函数。你将在接下来的文章中看到它们。在这里,你将学习如何使用 Matplotlib 来显示图像。你还能用 Matplotlib 缩放图像,保存图像等。

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt

img = cv.imread('messi5.jpg',0)
plt.imshow(img, cmap = 'gray', interpolation = 'bicubic')   # 让图像以灰色形式展示
# 或者选择  plt.imshow(img[:,:,::-1])    #这一步操作,保证和原图像显示的色彩一致
plt.xticks([]), plt.yticks([]) # 隐藏 X 和 Y 轴的刻度值  去掉则会显示刻度
plt.show()

色彩模式与cv2不一样(BGR),因此显示出来的颜色不对,需要改一下

plt.imshow(img[:,:,::-1])    #这一步操作,保证和原图像显示的色彩一致
plt.show()

图像的绘制功能

画线

去画一条线,你需要传递线条的开始和结束的坐标。我们将创建一个黑色图像,并在坐上角到右下角画一条蓝色的线

import numpy as np
import cv2 as cv
# 创建一个黑色的图像
img = np.zeros((512,512,3), np.uint8)
# 画一条 5px 宽的蓝色对角线
cv.line(img,(0,0),(511,511),(255,0,0),5)

cv2.line(图像,(起始坐标),(终点坐标),(颜色),宽度)

画圆

画一个圆,你需要它的圆心和半径。我们将在上面绘制的矩形上画一个内圆。

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

cv.circle(图像,(圆心坐标x,y),半径,(颜色),加载方式)

画椭圆

画一个椭圆,你需要传好几个参数。一个参数是圆心位置 (x,y)。下个参数是轴的长度 (长轴长度,短轴长度)。角度是椭圆在你逆时针方向的旋转角度。startAngle 和 endAngle 表示从长轴顺时针方向测量的椭圆弧的起点和终点。如整圆就传 0 和 360。更多细节请看 cv.ellipse() 的文档。下面是在这个图像中间画的一个半椭圆例子。

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

cv.ellipse(图像,(圆心坐标),(长轴,短轴),起时角度,起点,终点,颜色,加载方式

画矩形

cv.rectangle(img,左上角坐标,右下角坐标,颜色,线条厚度)

画多边形

画多边形,首先你需要顶点的做坐标。将这些点组成一个形状为 ROWSx1x2 的数组,ROWS 是顶点数,它应该是 int32 类型。这里我们绘制一个顶点是黄色的小多边形。

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

Note

  • 如果地三个是 False,你将获得所有点的折线,而不是一个闭合形状。
  • cv.polylines() 能画很多线条。只需创建你想绘制所有线条的列表,然后将其传给这个函数。所有线条都将单独绘制。绘制一组线条比调用 cv.line() 好很多,快很多。

绘图添加文字

cv.putText(img,输入内容,文本的放置位置,字体,字体大小,颜色,线条宽度,cv.LINE__AA)

访问并修改像素点

通过行列坐标来进行访问及修改

黄色为绿色和红色的混合。所以,该图像的所有像素值都应为R=255,G=255,B=0。

>>> import numpy as np
>>> import CV2
>>> img = CV2.imread("img/yellow.jpg")
>>> h,w,c = img.shape
#图像大小为128*128*3
>>> print(h,w,c)
128 128 3
px = img[100,100]     # 获取某个点的像素值

从上面的代码中可以看到,您可以通过行和列坐标访问像素值。注意,对于常见的RGB 图像,OpenCV的imread函数返回的是一个蓝色(Blue)值、绿色(Green)值、红色(Red)值的数组,维度大小为3。而对于灰度图像,仅返回相应的灰度值。

>>> img[100,100]
#OpenCV的读取顺序为B,G,R,由于图像所有像素为黄色,因此,G=255,R=255
array([  0, 255, 255], dtype=uint8)

# 仅访问蓝色通道的像素
>>> blue = img[100,100,0]
>>> print(blue)
0

你也可以使用同样的方法来修改像素值。

>>> img[100,100] = [255,255,255]
>>> print(img[100,100])
[255 255 255]

访问属性

图像大小

img.shape      # 变量.shape

(256,256,3)

img.shape[:2] 取彩色图片的长、宽。

  • 使用彩色模式传参时
cols,rows = img.shape[:2]
# 或者
cols,rows,x = img.shape
  • 使用灰色模式

    cols ,rows = img.shape
    

如果img.shape[:3] 则取彩色图片的长、宽、通道

关于img.shape[0]、[1]、[2]
img.shape[0]:图像的垂直尺寸(高度)
img.shape[1]:图像的水平尺寸(宽度)
img.shape[2]:图像的通道数

数据类型

img.dtype

dtype('uint8')

像素点数量

img.size

196608

图像的裁剪、拼接、翻转、缩放等 [(https://blog.csdn.net/zh_jessica/article/details/77946346)]

缩放:

一、图像缩放
图像缩放主要使用resize函数

result = cv2.resize(src, dsize[, result[. fx[, fy[, interpolation]]]]) 记得要用新变量来接收
其中src表示原始图像,dsize表示缩放大小,fx和fy也可以表示缩放大小倍数,他们两个(dsize或fx\fy)设置一个即可实现图像缩放

参数说明:

src - 原图

dst - 目标图像。当参数dsize不为0时,dst的大小为size;否则,它的大小需要根据src的大小,参数fx和fy决定。dst的类型(type)和src图像相同

dsize - 目标图像大小。当dsize为0时,它可以通过以下公式计算得出:

所以,参数dsize和参数(fx, fy)不能够同时为0

fx - 水平轴上的比例因子。当它为0时,计算公式如下:

fy - 垂直轴上的比例因子。当它为0时,计算公式如下:

interpolation - 插值方法。共有5种:
INTER_NEAREST - 最近邻插值法
INTER_LINEAR - 双线性插值法(默认)
INTER_AREA - 基于局部像素的重采样(resampling using pixel area relation)。对于图像抽取也叫缩小图像(image decimation)来说,这可能是一个更好的方法。但如果是放大图像时,它和最近邻法的效果类似。
INTER_CUBIC - 基于4x4像素邻域的3次插值法
INTER_LANCZOS4 - 基于8x8像素邻域的Lanczos插值

缩小图像 用INTER_AREA更好,放大图像用 INTER_CUBIC更好;
————————————————

代码如下:

import cv2

#读取图片
image = cv2.imread("E:/pythonProject/xin.jpeg")

#图片缩放
image1 = cv2.resize(image, (200,200))     

#图片显示
cv2.imshow("resize", image1)
cv2.imshow("image", image)

#等待窗口
cv2.waitKey(0)

旋转

opencv中对图像的旋转主要是先通过getRotationMatrix2D函数得到图像的旋转矩阵,然后再通过仿射变换函数warpAffine得到旋转后的图像。

函数说明:

cv2.getRotationMatrix2D(center, angle, scale)
cv2.warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]]) → dst

参数说明:

getRotationMatrix2D: 得到图像的旋转矩阵

center–表示旋转的中心点
angle–表示旋转的角度degrees
scale–图像缩放因子
warpAffine:

src – 输入的图像
M – 2 X 3 的变换矩阵.
dsize – 输出的图像的size大小
dst – 输出的图像
flags – 输出图像的插值方法
borderMode – 图像边界的处理方式
borderValue – 当图像边界处理方式为BORDER_CONSTANT 时的填充值
代码示范:

img = cv2.imread('messi5.jpg',0)
rows,cols = img.shape
#90度旋转

M = cv2.getRotationMatrix2D((cols/2,rows/2),90,1)
dst = cv2.warpAffine(img,M,(cols,rows))

平移

  1. 平移translate
    平移通过自定义平移矩阵以及函数warpAffine实现:

代码示范:

img = cv2.imread('messi5.jpg',0)
rows,cols = img.shape
# 平移矩阵M:[[1,0,x],[0,1,y]]
M = np.float32([[1,0,100],[0,1,50]])
dst = cv2.warpAffine(img,M,(cols,rows))

反转

  1. 翻转flip
    翻转通过函数flip实现:

函数说明:

cv2.flip(src, flipCode[, dst]) → dst
1
参数说明:

src – 输入的图像
dst – 输出的图像
flipCode – 翻转模式,flipCode==0垂直翻转(沿X轴翻转),flipCode>0水平翻转(沿Y轴翻转),flipCode<0水平垂直翻转(先沿X轴翻转,再沿Y轴翻转,等价于旋转180°)
代码示范:

# 水平翻转
flip_horiz_img = cv2.flip(pad_img, 1)
# 垂直翻转
flip_verti_img = cv2.flip(pad_img, 0)
# 水平垂直翻转
flip_horandver_img = cv2.flip(pad_img, -1)

拼接

单个图像多次拼接

import  cv2
img =cv2.imread(file_path[i])
img=cv2.hconcat([img,img,img])#水平拼接
img=cv2.vconcat([img,img,img])#垂直拼接

多个相似特征图像拼接(开摆!)

import cv2
import numpy as np
 
 
def stitch(image):
    # 图像拼接
    # stitcher = cv2.createStitcher(False)  # OpenCV 3.X.X.X使用该方法
    stitcher = cv2.Stitcher_create(cv2.Stitcher_PANORAMA)  # OpenCV 4.X.X.X使用该方法,cv2.Stitcher_create()也可以
    status, pano = stitcher.stitch(image)
 
    # 黑边处理
    if status == cv2.Stitcher_OK:
        # 全景图轮廓提取
        stitched = cv2.copyMakeBorder(pano, 10, 10, 10, 10, cv2.BORDER_CONSTANT, (0, 0, 0))
        gray = cv2.cvtColor(stitched, cv2.COLOR_BGR2GRAY)
        thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY)[1]
        cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0]
 
        # 轮廓最小正矩形
        mask = np.zeros(thresh.shape, dtype="uint8")
        (x, y, w, h) = cv2.boundingRect(cnts[0])  # 取出list中的轮廓二值图,类型为numpy.ndarray
        cv2.rectangle(mask, (x, y), (x + w, y + h), 255, -1)
 
        # 腐蚀处理,直到minRect的像素值都为0
        minRect = mask.copy()
        sub = mask.copy()
        while cv2.countNonZero(sub) > 0:
            minRect = cv2.erode(minRect, None)
            sub = cv2.subtract(minRect, thresh)
 
        # 提取minRect轮廓并裁剪
        cnts = cv2.findContours(minRect, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0]
        (x, y, w, h) = cv2.boundingRect(cnts[0])
        stitched = stitched[y:y + h, x:x + w]
 
        cv2.imshow('stitched', stitched)
        cv2.imwrite('stitched.jpg', stitched)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
    else:
        print('图像匹配的特征点不足')
 
 
if __name__ == "__main__":
    image1 = cv2.imread('data/space1.jpg')
    image2 = cv2.imread('data/space2.jpg')
    image3 = cv2.imread('data/space3.jpg')
    image = image1, image2, image3
    stitch(image)

(18条消息) OpenCV-Python 图像全景拼接stitch及黑边处理_Klein-的博客-CSDN博客_stitcher_create

标签:之旅,img,python,cv2,opencv,shape,图像,cv,255
From: https://www.cnblogs.com/Tan-code/p/17011349.html

相关文章

  • 我的Python笔记02
    声明:本文整理借鉴金角大王的Python之路,Day2-Python基础2,仅供本人学习使用!!!本节内容列表、元组操作字符串操作字典操作集合操作文件操作字符编码与转码 1.列表、元组操作......
  • 距离产生美?k近邻算法python实现
    微信公众号:AI有道(ID:redstonewill)1.什么是k近邻算法?k最近邻(k-NearestNeighbor,kNN)分类算法是一个比较成熟也是最简单的机器学习(MachineLearning)算法之一。该方法的思......
  • Python__16--集合
    1集合一句话,没有value的字典,无序可变序列。1.1集合的创建1.1.1使用{}s={2,3,4,5,5,6,7,7}#输出为{2,3,4,5,6,7}集合中元素不允许重复1.1.2使用set()测试代码:......
  • @05.Python基本运算符
    文章目录​​一.基本运算符的介绍​​​​1.运算符概述​​​​2.运算符的分类​​​​二.基本运算符的使用​​​​1.算数运算符​​​​1》算数运算符的介绍​​​​2》P......
  • CentOS7.9 安装 Python3.7.9
    #安装依赖yum-yinstallzlib-develbzip2-developenssl-develncurses-develsqlite-develreadline-develtk-develgdbm-develdb4-devellibpcap-develxz-devell......
  • python里面一些零碎知识点
    Python中反斜杠可以用在一行结尾做续行符使用。pytorch中,一般来说如果对tensor的一个函数后加上了下划线,则表明这是一个in-place类型。in-place类型是指,当在一个tenso......
  • Hadoop3.0基础平台搭建(三节点),以及案例运行并使用python生成词云
    一、设备配置列表,软件包二、主机名映射三、生成密钥四、将密钥发送到各个节点五、注意事项及验证六、关闭防火墙和SeLinux安全模块(所有主机均需操作七、解压JDK、had......
  • python 下载m3u8 加密与非加密 收集
    #!/usr/bin/envpython#encoding:utf-8importrequests,os,platform,timefromCrypto.CipherimportAESimportmultiprocessingfromretryingimportretryc......
  • Python 爬取微博指定博主所有内容
    这么做有啥用呢,一方面是为了防止他的微博删除,另一方面怕被系统和谐,所以就把他的微博内容爬取下来,然后保存到word文档中,以备不时查看...那么接下来进入爬虫分析环节,小编这里......
  • 使用Python无水印下载抖音图文
    从刚上线时只是一款音乐创意短视频社交软件,到如今涵盖了短视频、直播、社交、购物、本地生活服务,抖音正在急速扩张。抖音的野心还不止于此。今年,抖音上线了新的内容——图文......