opencv快速入门【python]

这篇具有很好参考价值的文章主要介绍了opencv快速入门【python]。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一.opencv的基础操作

1.读入图像

使用cv2.imread()读取图像

import cv2
import numpy as np
cv2.imread("img",flags)#flags=0图像为灰度图,flags=1图像为彩色图

2.显示图像

使用函数 cv2.imshow() 显示图像。

cv2.imshow("img",img)#第一个参数为窗口名称,第二个参数是所放图像名称
cv2.waitKey(0)#等待时间,表示毫秒级,0代表任意键终止,1000代表1秒
cv2.destroyAllWindows()#摧毁窗口

3.保存图像

使用函数cv2.imwrite()来保存函数

二.opencv的绘图函数

学习目标:

  • 掌握用opencv绘制出不同几何图形

  • 熟练应用如下函数:cv2.line(),cv2.circle(),cv2.rectangle() ,cv2.ellipse() ,cv2.putText() 等。

绘出几何图形的第一步就是要先创建好一个黑色画布(np.zeros函数)

np.zeros(shape,dtype)#shape:创建的新数组的形状(维度)。dtype:创建新数组的数据类型。

1.用opencv画出直线(cv2.line()函数)

cv2.line(img, pt1, pt2, color, thickness=None, lineType=None, shift=None)
img    图像.
pt1    线段的第一个点.
pt2    线段的第二个点.
color    线条颜色.
thickness    线条粗细.
lineType    线条类型.
shift    坐标的小数位数

import cv2
import numpy as np
img=np.zeros((512,512,3),np.uint8)
cv2.line(img,(0,0),(512,512),(255,0,0),5,16)#绘制的黑色图像,起点,终点,颜色,粗细,类型
cv2.imshow("img",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

                                                                                               opencv快速入门【python],opencv,python,人工智能

2.用opencv画出矩形(cv2.rectangle()函数)

cv2.rectangle(img, pt1, pt2, color, thickness=None, lineType=None, shift=None)
img    图像.
pt1    矩形的顶点.
pt2    与pt1相对的矩形顶点.
color    矩形颜色或亮度(灰度图像).
thickness    构成矩形的线条的粗细(如果为正数)。负值(如 FILLED)表示函数必须绘制填充矩形.
lineType    线路类型. See LineTypes
shift    点坐标的小数位数

import cv2
import numpy as np
img=np.zeros((512,512,3),np.uint8)
cv2.rectangle(img,(0,0),(160,160),(0,255,0),5)#绘制的黑色图像,左上角点,右上角点,颜色,粗细
cv2.imshow("img",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

opencv快速入门【python],opencv,python,人工智能

3 .用opencv画出圆(cv2.circle()函数)

cv2.circle(img, center, radius, color, thickness=None, lineType=None, shift=None)
img    图像.
center    圆心.
radius    圆的半径.
color    圆的颜色.
thickness    圆轮廓的粗细(如果为正)。负值,如 FILLED,表示要绘制一个填充的圆.
lineType    圆边界的类型.
shift    圆心坐标和半径值的小数位数

import cv2
import numpy as np
img=np.zeros((512,512,3),np.uint8)
cv2.circle(img,(216,216),166,(0,0,255),5,16)#绘制的黑色图像,圆心,半径,颜色,粗细,类型
cv2.imshow("img",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

opencv快速入门【python],opencv,python,人工智能

4.用opencv画椭圆(cv2.ellipse()函数)

cv2.ellipse(img, center, axes, angle, startAngle, endAngle, color, thickness=None, lineType=None, shift=None)
img    图像.
center    椭圆的中心.
axes    椭圆主轴尺寸的一半.
angle    椭圆旋转角度(以度为单位).
startAngle    椭圆弧的起始角度(以度为单位).
endAngle    椭圆弧的结束角(以度为单位).
color    椭圆颜色.
thickness    椭圆弧轮廓的厚度(如果为正)。否则,这表示要绘制填充的椭圆扇区.
lineType    椭圆边界的类型. 
shift    中心坐标和轴长的小数位数

import cv2
import numpy as np
img=np.zeros((512,512,3),np.uint8)
cv2.ellipse(img,(256,256),(100,50),0,0,180,255,-1)#绘制的黑色图像,圆心,长轴和短轴,椭圆的旋转角度,椭圆的起始角度,椭圆的终止角度,颜色,填充形状
cv2.imshow("img",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

opencv快速入门【python],opencv,python,人工智能

5.用opencv画多边形(cv2.polylines()函数)

cv2.polylines(img, pts, isClosed, color, thickness=None, lineType=None, shift=None)
img    图像.
pts    多边形曲线数组.
isClosed    指示绘制的折线是否闭合的标志。如果它们闭合,则该函数将绘制一条从每条曲线的最后一个顶点到其第一个顶点的线.
color    折线颜色.
thickness    折线边的厚度.
lineType    线段的类型. See LineTypes
shift    顶点坐标中的小数位数.

import cv2
import numpy as np
img=np.zeros((512,512,3),np.uint8)
pts = np.array([[100,50],[200,300],[220,200],[50,100]], np.int32)
pts = pts.reshape((-1,1,2))
cv2.polylines(img,[pts],True,(0,255,255))
cv2.imshow("img",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

opencv快速入门【python],opencv,python,人工智能

6.在图片上添加文字(cv2.putText()函数)

cv2.putText(img, text, org, fontFace, fontScale, color, thickness=None, lineType=None, bottomLeftOrigin=None)
img    图像.
text    要绘制的文本字符串.
org    图像中文本字符串的左下角.
fontFace    字体类型.
fontScale    字体比例因子乘以特定于字体的基本大小.
color    文本颜色.
thickness    用于绘制文本的线条粗细.
lineType    线型.
bottomLeftOrigin    如果为 true,则文本起点坐标位于左下角。否则,它位于左上角(字体呈现上下翻转).

import cv2
import numpy as np
img=np.zeros((512,512,3),np.uint8)
font=cv2.FONT_HERSHEY_COMPLEX#字体
cv2.putText(img,"opencv",(150,100),font,2,(255,255,255),5,cv2.LINE_AA)#绘制的图形,字体位置,字体,字体大小,字体颜色,字体粗细,字体类型
cv2.imshow("img",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

opencv快速入门【python],opencv,python,人工智能

三.opencv图像的基本操作

学习目标:

       • 获取像素值并修改
  • 获取图像的属性(信息)
  • 图像通道的拆分及合并

1.获取并修改像素值

根据像素的行和列的坐标获取他的像素值。对 BGR 图像而言,返回值为 B,G,R 的值。对灰度图像而言,会返回他的灰度值

import cv2
import numpy as np
img=cv2.imread("images/cat.jpg")
img1=img[100,100]
print(img1)
img2=img[100,100,0]
print(img2)
#运行结果
#[28 32 43]
#28

修改图像像素值

import cv2
import numpy as np
img=cv2.imread("images/cat.jpg")
img[100,100]=[255,255,255]
print(img[100,100])
#运行结果
#[255 255 255]

2.获取图像属性

图像的属性包括:行,列,通道,图像数据类型,像素数目等img.shape 可以获取图像的形状。

import cv2
import numpy as np
img=cv2.imread("images/cat.jpg")
print(img.shape)
#运行结果
#(150, 300, 3)

3. 拆分及合并图像通道

对 BGR 三个通道分别进行操作。这就需要把 BGR 拆分成单个通道。有时需要把独立通道的图片合并成一个 BGR 图像。

import cv2
import numpy as np
img=cv2.imread('images/cat.jpg')
b,g,r=cv2.split(img)
img=cv2.merge(b,g,r)

或:

import cv2
import numpy as np
img=cv2.imread('images/cat.jpg')
b=img[:,:,0]
print(b)

4.为图像扩边(填充)

 如果你想在图像周围创建一个边,你可以使用 cv2.copyMakeBorder()函数。

• src 输入图像
  • top, bottom, left, right 对应边界的像素数目。
  • borderType 要添加那种类型的边界,类型如下:
    – cv2.BORDER_CONSTANT 添加有颜色的常数值边界,还需要下一个参数(value)。
    – cv2.BORDER_REFLECT 边界元素的镜像。比如: fedcba|abcde-fgh|hgfedcb
    – cv2.BORDER_REFLECT_101 or cv2.BORDER_DEFAULT跟上面一样,但稍作改动。例如: gfedcb|abcdefgh|gfedcba
    – cv2.BORDER_REPLICATE 重复最后一个元素。例如: aaaaaa|abcdefgh|hhhhhhh
    – cv2.BORDER_WRAP 不知道怎么说了, 就像这样: cdefgh|abcdefgh|abcdefg
  • value 边界颜色,如果边界的类型是 cv2.BORDER_CONSTANT

import cv2
import numpy as np
from matplotlib import pyplot as plt
BLUE=[255,0,0]
img1=cv2.imread('images/cat.jpg')
replicate = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_WRAP)
constant= cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_CONSTANT,value=BLUE)
plt.subplot(231),plt.imshow(img1,'gray'),plt.title('ORIGINAL')
plt.subplot(232),plt.imshow(replicate,'gray'),plt.title('REPLICATE')
plt.subplot(233),plt.imshow(reflect,'gray'),plt.title('REFLECT')
plt.subplot(234),plt.imshow(reflect101,'gray'),plt.title('REFLECT_101')
plt.subplot(235),plt.imshow(wrap,'gray'),plt.title('WRAP')
plt.subplot(236),plt.imshow(constant,'gray'),plt.title('CONSTANT')
plt.show()

opencv快速入门【python],opencv,python,人工智能

5.图像加法

可以使用函数 cv2.add() 将两幅图像进行加法运算,当然也可以直接使用 numpy。res=img1+img2。两幅图像的大小,类型必须一致,或者第二个图像可以使一个简单的标量值。

import cv2
import numpy as np
img1 = np.random.randint(0, 256, size=(3, 3), dtype=np.uint8)
img2 = np.random.randint(0, 256, size=(3, 3), dtype=np.uint8)
cv2.add(img1,img2)
#array([[173, 203, 249],
#       [ 68, 116, 239],
 #      [189, 142, 148]], dtype=uint8)
import cv2
import numpy as np
img1 = np.random.randint(0, 256, size=(3, 3), dtype=np.uint8)
img2 = np.random.randint(0, 256, size=(3, 3), dtype=np.uint8)
res=img1+img2
print(res)
#array([[173, 203, 249],
#       [ 68, 116, 239],
 #      [189, 142, 148]], dtype=uint8)

6. 图像混合

使用函数cv2.addWeighted()函数把两幅图混合在一起。cv2.addWeighted()函数就是加重权限的意思。第一幅图的权重是 0.7,第二幅图的权重是 0.3。按照dst = α · img1 + β · img2 + γ计算图像混合.

import cv2
import numpy as np
img1 = np.ones((3, 4), dtype=np.uint8)*100
img2 = np.ones((3, 4), dtype=np.uint8)*10
img1, img2
alpha, beta, gamma = 0.2, 0.8, 0            
img3 = cv2.addWeighted(img1, alpha, img2, beta, gamma)
img3
import cv2
import numpy as np
img1=cv2.imread('images/cat.jpg')
img2=cv2.imread('images/shu.jpg')
dst=cv2.addWeighted(img1,0.7,img2,0.3,0)
cv2.imshow('dst', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

7.按位运算

这里包括的按位操作有:AND,OR,NOT,XOR 等。如果想把 OpenCV 的标志放到另一幅图像上。使用加法,颜色会改变,如果使用混合,会得到透明效果,但是不想要透明。如果他是矩形可以使用 ROI。但是他不是矩形。但是我们可以通过下面的按位运算实现:

  • cv2.bitwise_and()函数(按位与运算)

与运算有两个特点,如果某像素与纯白像素做与运算,结果仍然是某像素的原值,如果某像素与纯黑像素做与运算,结果为纯黑像素,由此可以得出,如果原图像与掩模进行与运算,原图像仅保留掩模中白色区域覆盖的内容,其他区域变成黑色

import cv2
import numpy as np
img=cv2.imread("images/cat.jpg")
mask=np.zeros(img.shape,np.uint8)
mask[50:100,:,:]=255  # 横着的白色区域
mask[:,125:175,:]=255  # 竖着的白色区域
img1=cv2.bitwise_and(img,mask)
cv2.imshow('img',img)
cv2.imshow('mask',mask)
cv2.imshow('img1',img1)
cv2.waitKey(0)
cv2.destroyAllWindows()
opencv快速入门【python],opencv,python,人工智能
  • cv2.bitwise_or()函数(按位或运算)

如果某像素与纯白像素做或运算,结果仍然是纯白像素,如果某像素与纯黑像素做或运算,结果仍然是某像素的原值,由此可以得出,如果原图像与掩模进行或运算,原图像仅保留掩模中黑色区域覆盖的内容,其他区域变成白色

import cv2
import numpy as np
img=cv2.imread("images/cat.jpg")
mask=np.zeros(img.shape,np.uint8)
mask[50:100,:,:]=255  # 横着的白色区域
mask[:,125:175,:]=255  # 竖着的白色区域
img1=cv2.bitwise_or(img,mask)
cv2.imshow('img',img)
cv2.imshow('mask',mask)
cv2.imshow('img1',img1)
cv2.waitKey(0)
cv2.destroyAllWindows()

opencv快速入门【python],opencv,python,人工智能

  • cv2.bitwise_not()函数(按位取反运算)

取反运算是一种单目运算,图像经过取反运算后呈现与原图颜色完全相反的效果

import cv2
import numpy as np
img=cv2.imread("images/cat.jpg")
img1=cv2.bitwise_not(img)
cv2.imshow('img',img)
cv2.imshow('img1',img1)
cv2.waitKey(0)
cv2.destroyAllWindows()

opencv快速入门【python],opencv,python,人工智能

  • cv2.bitwise_xor()函数(按位异或运算)

异或运算也是按照二进制位进行判断,如果某像素与纯白像素做异或运算,结果位原像素的取反结果,如果某像素与纯黑像素做异或运算,结果仍然是某像素的原值,如果原图像与掩模进行异或运算,掩模白色区域覆盖的内容呈现取反效果,黑色区域覆盖内容保持不变

import cv2
import numpy as np
img=cv2.imread("images/cat.jpg")
mask=np.zeros(img.shape,np.uint8)
mask[50:100,:,:]=255  # 横着的白色区域
mask[:,125:175,:]=255  # 竖着的白色区域
img1=cv2.bitwise_xor(img,mask)
cv2.imshow('img',img)
cv2.imshow('mask',mask)
cv2.imshow('img1',img1)
cv2.waitKey(0)
cv2.destroyAllWindows()

opencv快速入门【python],opencv,python,人工智能

 8.图像的加密和解密

异或运算有一个特点,执行一次异或运算得到一个结果,再对这个结果执行第二次异或运算,则还原成最初的值,利用这个特点可以实现对图像内容的加密和解密

import cv2
import numpy as np
lena=cv2.imread("images/lena.jpg")
row, colm,count =lena.shape
key=np.random.randint(0, 256, size=[row, colm,count], dtype=np.uint8)
img=cv2.bitwise_xor(lena,key)#加密
img1=cv2.bitwise_xor(img,key)#解密
cv2.imshow('lena',lena)
cv2.imshow('key',key)
cv2.imshow('img',img)
cv2.imshow('img1',img1)
cv2.waitKey(0)
cv2.destroyAllWindows()

opencv快速入门【python],opencv,python,人工智能文章来源地址https://www.toymoban.com/news/detail-784528.html

到了这里,关于opencv快速入门【python]的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包