python opencv核心操作-1

        说到计算机视觉,就不能不提到 OpenCV,它是一个历史悠久、功能丰富、社区活跃的开源视觉开发库。OpenCV 基于 C++ 编写,但提供了 Python、Ruby、MATLAB 等多种语言接口。这对于习惯使用 Python 开发的人工智能从业者来说非常方便。

安装及提示问题

        对于opencv的安装,使用pip去换源进行安装。而在我们安装opencv后,在pycharm中引入并使用时,可能会出现没有提示的问题。

pip install opencv-python -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com

        为了解决这个问题,首先找到F:\Python\Anaconda\Lib\site-packages\cv2路径下的cv2.pyd文件。

         将这个文件复制到site-packages文件夹下,就可以解决pycharm中opencv没有提示的问题。

图像读取:图像的读取显示和保存

读取图像

img = cv2.imread("python.png")
cv2.imshow("img",img)#参数一:图片框名字
cv2.waitKey(0)#图片框保留
cv2.destroyWindow()

 注意,这里读取出来的数据类型为numpy数组

 图片创建及保存

img = np.empty((200, 200, 3), np.uint8)#uint8取值范围为0-255
img[..., 0] = 255
img[..., 1] = 0
img[..., 2] = 0
cv2.imwrite("1.jpg", img)#参数一:文件名字
cv2.imshow("img",img)#参数一:图片框名字
cv2.waitKey(0)#图片框保留
cv2.destroyWindow()

 

为numpy数组的第一个通道赋值为255,但是得到的图像颜色却为蓝色,opencv打开图像是以BGR的通道顺序打开的。

视频读取:读取视频或摄像头并显示

读取视频或摄像头

capture = cv2.VideoCapture(0)#读取摄像头
# capture = cv2.VideoCapture("test.mp4")#读取视频
while True:
    ret,frame = capture.read()
    cv2.imshow("frame",frame)
    if cv2.waitKey(1) & 0xff == ord("q"):
        break
capture.release()
cv2.destroyWindow()

读取视频是以连续的图片来展示的

通道分离

img = cv2.imread("python.png")
img[...,0] = 0
img[...,1] = 0
cv2.imshow("img",img)
cv2.waitKey(0)
cv2.destroyWindow()

记住关键点:opencv打开的图片为numpy数组,而且为BGR格式

HSV颜色空间

HSV 格式中, H(色彩/ 色度)的取值范围是 [0 179] S (饱和度)的取值范围 [0 255] V(亮
度)的取值范围 [0 255] 。但是不同的软件使用的值可能不同。所以当你需要拿 OpenCV HSV
值与其他软件的 HSV 值进行对比时,一定要记得归一化。

img = cv2.imread("python.png")
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)#将图像转换为HSV格式
lower_blue = np.array([100, 200, 100])
upper_blue = np.array([200, 255, 200])
mask = cv2.inRange(hsv, lower_blue, upper_blue)#高于或低于阈值的赋值为0
cv2.imshow('frame', img)
cv2.imshow('mask', mask)
cv2.waitKey(0)

 提取自己需要的HSV颜色空间

color=np.uint8([[[21,94,214]]])
hsv_color=cv2.cvtColor(color,cv2.COLOR_BGR2HSV) 
print(hsv_color)

基本图形的绘制

img = cv2.imread("python.png")
#直线 原图 坐标 坐标 颜色 粗细
cv2.line(img,(0,0),(50,50),color=(0,0,255),thickness=2)
#圆 原图 中心 半径 颜色 粗细
cv2.circle(img,(50,50),50,(255,0,0),thickness=2)
#椭圆 原图 中心 (长短轴) 椭圆旋转角度 起始角度 结束角度
cv2.ellipse(img,(50,50),(100,50),180,0,360,(0,255,0),2)
#矩形 原图 坐标 坐标
cv2.rectangle(img,(0,0),(50,50),(15,25,35),2)
#多边形 原图 坐标(必须用中括号扩起) 是否闭合
pts = np.array([[10, 5], [50, 10], [70, 20], [20, 30]], np.int32)
cv2.polylines(img,[pts],isClosed=True,color=(125,0,125),thickness=2)
#文字 原图 文字 坐标 字体 大小 
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img,"python",(150,150),font,4,(178,78,8),2)
cv2.imshow("img",img)
cv2.waitKey(0)
cv2.destroyWindow()

阈值处理:理解二值化,进行二值化操作

二值化:

给定一个阈值,将图像中大于这个阈值的像素转换为255,而小于这个阈值的像素点转换为0。二值化处理后整个图象只有黑色或者白色。

在图像进行二值化操作前,必须将图像转换为灰度图

otsu二值化

自动选取最佳的阈值对整个图像进行二值化。

img = cv2.imread("python.png")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
cv2.imshow("gray",gray)
cv2.imshow('binary', binary)
cv2.waitKey(0)

自适应阈值二值化

是当同一幅图像上的不同部分的具有不同亮度时。这种情况下我们需要采用自适应阈值。此时的阈值是根据图像上的每一个小区域计算与其对应的阈值。因此在同一幅图像上的不同区域采用的是不 同的阈值,从而使我们能在亮度不同的情况下得到更好的结果。
Adaptive Method- 指定计算阈值的方法。
cv2.ADPTIVE_THRESH_MEAN_C :阈值取自相邻区域的平均值
cv2.ADPTIVE_THRESH_GAUSSIAN_C :阈值取值相邻区域的加权和,权重为一个高斯窗口。
Block Size - 邻域大小(用来计算阈值的区域大小)。
C - 这就是是一个常数,阈值就等于的平均值或者加权平均值减去这个常数
img = cv2.imread("python.png")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
binary = cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,11,2)
cv2.imshow("gray",gray)
cv2.imshow('binary', binary)
cv2.waitKey(0)

简单二值化 

像素值高于阈值时,我们给这个像素赋予一个新值(可能是白 色),否则我们给它赋予另外一种颜色(也许是黑色)。这个函数就是 cv2.threshhold() 。这个函数的第一个参数就是原图像,原图像应该是灰度图。第二个参数就是用来对像素值进行分类的阈值。第三个参数就是当像素值高于(有时是小于)阈值时应该被赋予的新的像素值。OpenCV提供了多种不同的阈
值方法,这是有第四个参数来决定的。这些方法包括:
• cv2.THRESH_BINARY
• cv2.THRESH_BINARY_INV
• cv2.THRESH_TRUNC
• cv2.THRESH_TOZERO
• cv2.THRESH_TOZERO_INV

img = cv2.imread("python.png")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret,binary = cv2.threshold(gray,125,255,cv2.THRESH_BINARY)
cv2.imshow("gray",gray)
cv2.imshow('binary', binary)
cv2.waitKey(0)

 图像上的运算

加减法

其实在本质上就是numpy数组的加减法

图像混合:两个图象的尺寸必须相同

第一幅图的权重是 0.7 ,第二幅图的权重是 0.3 。函数 cv2.addWeighted() 可以按下面的公式对图片进行混合操作。 dst = α · img1 + β · img2 + γ
这里 γ 的取值为 0
img1 = cv2.imread("python.png")
img1 = cv2.resize(img1,(200,200))
img2 = cv2.imread("test.png")
img2 = cv2.resize(img2,(200,200))
dst = cv2.addWeighted(img1, 0.7, img2, 0.3, 0)
cv2.imshow('dst', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

按位运算

cv2.bitwise_and()按位与
cv2.bitwise_or()按位或
cv2.bitwise_xor()按位异或
cv2.bitwise_not()按位取反

比如说按位与,当不为0的像素点与为0的像素点相与,则变为0.

img = cv2.imread("python.png")
mask = np.zeros(img.shape,dtype=np.uint8)
mask[100:400,200:400]=255
mask[100:500,100:200]=255
result = cv2.bitwise_and(img,mask)
cv2.imshow("img",img)
cv2.imshow("mask",mask)
cv2.imshow("result",result)
cv2.waitKey(0)
cv2.destroyWindow()

图像的几何变换

resize / transporse / flip

interpolation参数说明:

INTER_NEAREST - 最邻近插值
INTER_LINEAR - 双线性插值,如果最后一个参数你不指定,默认使用这种方法
INTER_AREA - 区域插值
INTER_CUBIC - 4x4 像素邻域内的双立方插值
INTER_LANCZOS4 - 8x8 像素邻域内的 Lanczos 插值
img = cv2.imread("python.png")
img1 = cv2.resize(img,(50,50),interpolation=cv2.INTER_CUBIC)#重新定义图片的尺寸
img2 = cv2.transpose(img)#对图片进行转置处理
img3 = cv2.flip(img,0)#1:水平翻转 0:垂直翻转 -1:水平垂直翻转
cv2.imshow("img",img)
cv2.imshow("img1",img1)
cv2.imshow("img2",img2)
cv2.imshow("img3",img3)
cv2.waitKey(0)
cv2.destroyWindow()

 仿射变换

任意一个二维图像,我们乘以一个仿射矩阵,就能得到仿射变换后的图像。变换包含:缩放、旋转、平 移、倾斜、镜像。

src = cv2.imread('python.png')
rows, cols, channel = src.shape
M = np.float32([[1, 0, 50], [0, 1, 50]])
# M = np.float32([[0.5, 0, 0], [0, 0.5, 0]]) #
# M = np.float32([[-0.5, 0, cols // 2], [0, 0.5, 0]])
# M = np.float32([[1, 0.5, 0], [0, 1, 0]])
# M = cv2.getRotationMatrix2D((cols / 2, rows / 2), 45, 0.7)
#原图 变换矩阵 输出图像的大小
dst = cv2.warpAffine(src, M, (cols, rows))
cv2.imshow('src', src)
cv2.imshow('dst', dst)
cv2.waitKey(0)
cv2.destroyWindow()

 

透视变换

img = cv2.imread("4.jpg")
#需要变换的位置 
pts1 = np.float32([[25, 30], [179, 25], [12, 188], [189, 190]]) 
#变换后的位置
pts2 = np.float32([[0, 0], [200, 0], [0, 200], [200, 200]]) 
#得到变换矩阵
M = cv2.getPerspectiveTransform(pts1, pts2) 
dst = cv2.warpPerspective(img, M, (200, 201)) 
cv2.imshow("src", img) 
cv2.imshow("dst", dst) 
cv2.waitKey(0)

膨胀操作

膨胀操作以及下列的相关操作一般是对图像的二值化图进行操作。

膨胀操作可以让颜色值大的像素变得更粗
#内核形状 内核尺寸
kernel = cv.getStructuringElement(cv.MORPH_RECT, (5, 5)) 
dst = cv.dilate(img, kernel) 
cv.imshow('src', img) 
cv.imshow('dst', dst) 
cv.waitKey(0)

 

腐蚀操作

腐蚀操作可以让颜色值大的像素变得更细
img = cv.imread("11.jpg", 0) 
kernel = cv.getStructuringElement(cv.MORPH_RECT, (5, 5)) 
dst = cv.erode(img, kernel) 
cv.imshow('src', img) 
cv.imshow('dst', dst) 
cv.waitKey(0)

开操作

开操作是先腐蚀再膨胀,开操作可以用于去噪
img = cv.imread("10.jpg", 0) 
kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3)) 
#原图 变换方式 内核 iterations:应用腐蚀操作的次数,可选项,默认值为 1
dst = cv.morphologyEx(img, cv.MORPH_OPEN, kernel, iterations=1) 
cv.imshow('src', img) 
cv.imshow('dst', dst) 
cv.waitKey(0)

  

闭操作

闭操作是先膨胀再腐蚀,闭操作可以用于补漏洞
img = cv.imread("10.jpg", 0) 
kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3)) 
#原图 变换方式 内核 iterations:应用腐蚀操作的次数,可选项,默认值为 1
dst = cv.morphologyEx(img, cv.MORPH_CLOSE, kernel, iterations=1) 
cv.imshow('src', img) 
cv.imshow('dst', dst) 
cv.waitKey(0)

  

礼帽操作

礼帽操作 = 开运算图像 - 原图像 获取噪音
img = cv.imread("10.jpg", 0) 
kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3)) 
#原图 变换方式 内核 iterations:应用腐蚀操作的次数,可选项,默认值为 1
dst = cv.morphologyEx(img, cv.MORPH_TOPHAT, kernel, iterations=1) 
cv.imshow('src', img) 
cv.imshow('dst', dst) 
cv.waitKey(0)

黑帽操作

黑帽操作 = 闭运算图像 - 原图像 获取漏洞
img = cv.imread("10.jpg", 0) 
kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3)) 
#原图 变换方式 内核 iterations:应用腐蚀操作的次数,可选项,默认值为 1
dst = cv.morphologyEx(img, cv.MORPH_BLACKHAT, kernel, iterations=1) 
cv.imshow('src', img) 
cv.imshow('dst', dst) 
cv.waitKey(0)

  

梯度操作

膨胀减去腐蚀
img = cv.imread("10.jpg", 0) 
kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3)) 
#原图 变换方式 内核 iterations:应用腐蚀操作的次数,可选项,默认值为 1
dst = cv.morphologyEx(img, cv.MORPH_GRADIENT, kernel, iterations=1) 
cv.imshow('src', img) 
cv.imshow('dst', dst) 
cv.waitKey(0)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值