一.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()
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()
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()
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()
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()
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图像的基本操作
学习目标:
• 获取像素值并修改
• 获取图像的属性(信息)
• 图像通道的拆分及合并
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()
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()
-
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()
-
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()
-
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()
8.图像的加密和解密
异或运算有一个特点,执行一次异或运算得到一个结果,再对这个结果执行第二次异或运算,则还原成最初的值,利用这个特点可以实现对图像内容的加密和解密文章来源:https://www.toymoban.com/news/detail-784528.html
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()
文章来源地址https://www.toymoban.com/news/detail-784528.html
到了这里,关于opencv快速入门【python]的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!