opencv 小结 【甲】
图片读取 cv2.imread()图片展示 cv2.imshow(name,img)彩图读取返回数组时B G R不是RGBcv2.waitKey(0)等待时间,表示毫秒级,0代表任意键终止def cv_show(name,img):cv2.imshow(name,img)cv2.waitKey(0)cv2.destroyAllWindows()im=cv2.imread(r'C:\Users\hk
图片读取 cv2.imread()
图片展示 cv2.imshow(name,img)
彩图读取返回数组时 B G R 不是RGB
cv2.waitKey(0) 等待时间,表示毫秒级,0代表任意键终止
def cv_show(name,img):
cv2.imshow(name,img)
cv2.waitKey(0)
cv2.destroyAllWindows()
im=cv2.imread(r'C:\Users\hk\Desktop\opencv\fate.png')
print(im.shape)
cv_show("001",im)

此代码可以在展示图片时,按动任意键结束展示
cv2.IMREAD_COLOR 彩色图像
cv2.IMREAD_GRAYSCALE 灰度图像
cv2.imread()中加入此参数可以改变返回值
imgray=cv2.imread(r'C:\Users\hk\Desktop\opencv\fate.png',cv2.IMREAD_GRAYSCALE)
print(imgray.shape)
cv_show("002",imgray)

imgray=cv2.imread(r'C:\Users\hk\Desktop\opencv\fate.png',cv2.IMREAD_COLOR)
print(imgray.shape)
cv_show("002",imgray)

保存图片
cv2.imwrite(路径,图片)
cv2.imwrite(r'C:\Users\hk\Desktop\opencv\fateGray.png',imgray)
查看图片大小,形状
im.shape 返回(高度,宽度)=(y,x)
im.size
读取视频
vc=cv2.VideoCapture(路径) 读取视频传入视频流
vc.isOpened() 检查是否打开正确
openv,fram=vc.read() 视频流获取一帧图片,返回布尔值(是否成功获取),与这一帧图像
0xFF==27 表示退出键 0xFF == ord('q') 表示按“q”键退出
release()释放摄像头
destroyAllWindows()关闭所有图像窗口
vc=cv2.VideoCapture(r"C:\Users\hk\Desktop\opencv\v.mp4")
if vc.isOpened():
openv,frame=vc.read()
else:
openv=False
while openv:
ret,frame=vc.read()
if frame is None:
break
if ret == True:
gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
cv2.imshow('result',gray)
if cv2.waitKey(200) & 0xFF==27:
break
vc.release()
cv2.destroyAllWindows()
截取图片
本质是数组切片
img=cv2.imread(r'C:\Users\hk\Desktop\opencv\fate.png')
fate=img[100:600,0:1000]
cv2.imwrite(r'C:\Users\hk\Desktop\opencv\fate-2.png',fate)
cv_show('fate',fate)

颜色通道提取 与 组合
b,g,r=cv2.split(img)
print(b,b.shape)
print(g,g.shape)
print(r,r.shape)

imgCopy=cv2.merge((b,b,r))
cv_show('',imgCopy)
imgCopy.shape

#只保留R
cimg=img.copy()
cimg[:,:,0]=0
cimg[:,:,1]=0
cv_show('',cimg)

边界填充
cv2.copyMakeBorder(图片,顶宽,底宽,左宽,右宽,填充类型)
cv2.BORDER_REPLICATE 复制边部一条像素
cv2.BORDER_REFLECT 镜像复制
cv2.BORDER_REFLECT_101 镜像复制(不复制最边的一条像素)
cv2.BORDER_WRAP 重复
cv2.BORDER_CONSTANT,value=0 纯色填充
img=cv2.imread(r'C:\Users\hk\Desktop\opencv\3.jpg')
topSize,bottomSize,leftSize,rightSize=(300,300,300,300)
i1=cv2.copyMakeBorder(img,topSize,bottomSize,leftSize,rightSize,borderType=cv2.BORDER_REPLICATE)
i2=cv2.copyMakeBorder(img,topSize,bottomSize,leftSize,rightSize,borderType=cv2.BORDER_REFLECT)
i3=cv2.copyMakeBorder(img,topSize,bottomSize,leftSize,rightSize,borderType=cv2.BORDER_REFLECT_101)
i4=cv2.copyMakeBorder(img,topSize,bottomSize,leftSize,rightSize,borderType=cv2.BORDER_WRAP)
i5=cv2.copyMakeBorder(img,topSize,bottomSize,leftSize,rightSize,borderType=cv2.BORDER_CONSTANT,value=0)
plt.figure(figsize=(30,25))
plt.subplot(231),plt.imshow(img[:,:,[2,1,0]]),plt.title('1')
plt.subplot(232),plt.imshow(i1[:,:,[2,1,0]]),plt.title('2')
plt.subplot(233),plt.imshow(i2[:,:,[2,1,0]]),plt.title('3')
plt.subplot(234),plt.imshow(i3[:,:,[2,1,0]]),plt.title('4')
plt.subplot(235),plt.imshow(i4[:,:,[2,1,0]]),plt.title('5')
plt.subplot(236),plt.imshow(i5[:,:,[2,1,0]]),plt.title('6')

数值计算
img1+100+img2 计算结果会自动取余(x%256)
cv2.add(img1,img2) 若结果大于255则取255
img1=cv2.imread(r'C:\Users\hk\Desktop\opencv\3.jpg')
img1=cv2.imread(r'C:\Users\hk\Desktop\opencv\2.jpg')
cv_show('',img1)
img1_1=img1-20
cv_show('',img1_1)


注意相加时形状大小一致
cv_show('',img1+img2[:450,:720])
cv_show('',cv2.add(img1,img2[:450,:720]))


图片拉伸 cv2_resize(图片,(宽,高)) 像素
cv_show('',cv2.resize(img2,(880,450)))

也可以通fx,fy调整,意思是原宽高的倍数
cv_show('',cv2.resize(img2,(0,0),fx=1,fy=1.5))

图像融合
cv2.addWeighted(图片1,占比1,图片2,占比2,偏移量)
图片1*占比1+图片2*占比2+偏移量
out=cv2.addWeighted(img1,0.6,img2[:450,:720],0.4,0)
plt.imshow(out[:,:,[2,1,0]])

out=cv2.addWeighted(img1,0.3,img2[:450,:720],0.7,0)
plt.imshow(out[:,:,[2,1,0]])

图像阈值
ret,dst=cv2.threshold(src,thresh,maxval,type)
src 输入图 thresh 阈值 maxval 超过阈值所赋的值
dst 输出图
type :
THRESH_BINARY 超过阈值部分取maxval,否则取0
THRESH_BINARY_INV 上式反转
THRESH_TRUNC 超过阈值的部分设为maxval,否则不变
THRESH_TOZERO 超过阈值的部分不变,否则取0
THRESH_TOZERO_INV 上式反转
imgray=cv2.imread(r'C:\Users\hk\Desktop\opencv\fate.png')
ret,thresh1=cv2.threshold(imgray,127,255,cv2.THRESH_BINARY)
ret,thresh2=cv2.threshold(imgray,127,255,cv2.THRESH_BINARY_INV)
ret,thresh3=cv2.threshold(imgray,127,255,cv2.THRESH_TRUNC)
ret,thresh4=cv2.threshold(imgray,127,255,cv2.THRESH_TOZERO)
ret,thresh5=cv2.threshold(imgray,127,255,cv2.THRESH_TOZERO_INV)
images=[imgray,thresh1,thresh2,thresh3,thresh4,thresh5]
plt.figure(figsize=(30,15))
for i in range(6):
plt.subplot(2,3,i+1)
plt.imshow(images[i][:,:,[2,1,0]],'gray')
plt.show()

imgray=cv2.imread(r'C:\Users\hk\Desktop\opencv\fate.png',cv2.IMREAD_GRAYSCALE)
cv_show("002",imgray)
ret,thresh1=cv2.threshold(imgray,127,255,cv2.THRESH_BINARY)
ret,thresh2=cv2.threshold(imgray,127,255,cv2.THRESH_BINARY_INV)
ret,thresh3=cv2.threshold(imgray,127,255,cv2.THRESH_TRUNC)
ret,thresh4=cv2.threshold(imgray,127,255,cv2.THRESH_TOZERO)
ret,thresh5=cv2.threshold(imgray,127,255,cv2.THRESH_TOZERO_INV)
images=[imgray,thresh1,thresh2,thresh3,thresh4,thresh5]
plt.figure(figsize=(30,15))
for i in range(6):
plt.subplot(2,3,i+1)
plt.imshow(images[i],"gray")
plt.show()

图形平滑处理
均值滤波 cv2.blur(图片,(x,y)) (x,y)卷积核大小
方框滤波 cv2.boxFilter(图片,-1,(x,y),normalize=True) 基本与均值滤波一样,可以选择归一化 -1 表示颜色通道一致 normalize=True 归一化(防止越界) normalize=False一旦越界取255
高斯滤波 cv2.GaussianBlur(图片,(x,y),sigmaX X方向上的高斯核标准偏差)
中值滤波 cv2.medianBlur(图片,卷积核大小)
img=cv2.imread(r"C:\Users\hk\Desktop\opencv\c.png")
blur=cv2.blur(img,(3,3))
cv_show('',blur)
box1=cv2.boxFilter(img,-1,(3,3),normalize=True)
cv_show('',box1)
box2=cv2.boxFilter(img,-1,(3,3),normalize=False)
cv_show('',box2)
gaussian=cv2.GaussianBlur(img,(7,7),1)
cv_show('',gaussian)
median=cv2.medianBlur(img,5)
cv_show('',median)






数组连接 横向 np.hstack((1,2,3...))
纵向np.vstack((1,2,3...))
res=np.hstack((img,blur,box1,box2,gaussian,median))
plt.imshow(res[:,:,[2,1,0]])

res=np.vstack((img,blur,box1,box2,gaussian,median))
plt.imshow(res[:,:,[2,1,0]])

形态学——腐蚀操作
cv2.erode(图片,卷积核,iterations迭代次数)
test=cv2.imread(r"C:\Users\hk\Desktop\opencv\0.png")
kernel1=np.ones((5,5),np.uint8)
kernel2=np.ones((17,17),np.uint8)
out11=cv2.erode(test,kernel1,iterations=3)
out13=cv2.erode(test,kernel1,iterations=6)
out21=cv2.erode(test,kernel2,iterations=3)
out23=cv2.erode(test,kernel2,iterations=6)
out=np.hstack((test,out11,out13,out21,out23))
plt.imshow(out)



img=cv2.imread(r"C:\Users\hk\Desktop\opencv\8.jpg")
kernel=np.ones((5,5),np.uint8)
plt.imshow(cv2.erode(img,kernel,iterations=3)[:,:,[2,1,0]])

原图
膨胀操作
cv2.dilate(图片,卷积核,iterations迭代次数)
img=cv2.imread(r"C:\Users\hk\Desktop\opencv\9.png")
kernel=np.ones((3,3),np.uint8)
kernel2=np.ones((5,5),np.uint8)
out11=cv2.dilate(test,kernel1,iterations=1)
out13=cv2.dilate(test,kernel1,iterations=20)
out21=cv2.dilate(test,kernel2,iterations=1)
out23=cv2.dilate(test,kernel2,iterations=20)
out=np.hstack((img,out11,out13,out21,out23))
plt.imshow(out)



开运算 与 闭运算
cv2.morphologyEx(图片,类型,卷积核)
开:先腐蚀 后膨胀 cv2.MORPH_OPEN
闭:先膨胀 后腐蚀 cv2.MORPH_CLOSE
img=cv2.imread(r"C:\Users\hk\Desktop\opencv\p.png")
kernel=np.ones((7,7),np.uint8)
imOpen=cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)
imClose=cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)
out=np.hstack((img,imOpen,imClose))
plt.imshow(out)



梯度运算
本质:膨胀 — 腐蚀
cv2.morphologyEx(图片,cv2.MORPH_GRADIENT,卷积核)
img=cv2.imread(r"C:\Users\hk\Desktop\opencv\0.png")
kernel=np.ones((7,7),np.uint8)
imd=cv2.morphologyEx(img,cv2.MORPH_GRADIENT,kernel)
plt.imshow(imd)


img=cv2.imread(r"C:\Users\hk\Desktop\opencv\0.png")
kernel=np.ones((7,7),np.uint8)
out1=cv2.erode(img,kernel,iterations=1)
out2=cv2.dilate(img,kernel,iterations=1)
imd=out2-out1
#imd=cv2.morphologyEx(img,cv2.MORPH_GRADIENT,kernel)
plt.imshow(imd)

礼帽 = 原始数据 - 开运算结果
黑帽 = 闭运算 - 原始数据
MORPH_TOPHAT 礼帽
MORPH_BLACKHAT 黑帽
img=cv2.imread(r"C:\Users\hk\Desktop\opencv\o.png")
kernel=np.ones((7,7),np.uint8)
out1=cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel)
out2=cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel)
plt.subplot(121),plt.imshow(out1)
plt.subplot(122),plt.imshow(out2)
plt.show()



Sobel 算子
-1 0 1 -1 -2 -1
-2 0 2 0 0 0
-1 0 1 1 2 1
cv2.Sobel(src,ddepth,dx,dy,ksize)
ddepth:图像深度 一般选 -1;表示输入输出深度一致
dx,dy表示水平,竖直方向
ksize 是Sobel算子大小
cv2.convertScaleAbs(图片) 将图片数组数值绝对值化,否则负数将视为0;
img=cv2.imread(r"C:\Users\hk\Desktop\opencv\0.png")
sobelx=cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
sobelx=cv2.convertScaleAbs(sobelx)
plt.subplot(121),plt.imshow(img)
plt.subplot(122),plt.imshow(sobelx)
plt.show()

img=cv2.imread(r"C:\Users\hk\Desktop\opencv\0.png")
sobely=cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
sobely=cv2.convertScaleAbs(sobely)
plt.subplot(121),plt.imshow(img)
plt.subplot(122),plt.imshow(sobely)
plt.show()

sobelxy=cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
plt.imshow(sobelxy)

直接将dx,dy设为1,1 的缺陷

im=cv2.imread(r'C:\Users\hk\Desktop\opencv\3.3.jpg',cv2.IMREAD_GRAYSCALE)
sobelx=cv2.Sobel(im,cv2.CV_64F,1,0,ksize=3)
sobelx=cv2.convertScaleAbs(sobelx)
sobely=cv2.Sobel(im,cv2.CV_64F,0,1,ksize=3)
sobely=cv2.convertScaleAbs(sobely)
sobelxy=cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
# plt.subplot(121),plt.imshow(im,'gray')
# plt.subplot(122),plt.imshow(sobelxy,'gray')
# plt.show()
cv_show('',im)
cv_show('',sobelxy)

Scharr 算子
laplacian 算子
cv2.Scharr(图像,cv2.CV_64F,dx,dy)
cv2.Laplacian(图像,cv2.CV_64F)
scharr:
-3 0 3 -3 -10 -3
-10 0 10 0 0 0
-3 0 3 3 10 3
laplacin:
0 1 0
1 -4 1
0 1 0
im=cv2.imread(r'C:\Users\hk\Desktop\opencv\2.jpg',cv2.IMREAD_GRAYSCALE)
sobelx=cv2.Sobel(im,cv2.CV_64F,1,0,ksize=3)
sobelx=cv2.convertScaleAbs(sobelx)
sobely=cv2.Sobel(im,cv2.CV_64F,0,1,ksize=3)
sobely=cv2.convertScaleAbs(sobely)
sobelxy=cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
scharrx=cv2.Scharr(im,cv2.CV_64F,1,0)
scharrx=cv2.convertScaleAbs(scharrx)
scharry=cv2.Scharr(im,cv2.CV_64F,0,1)
scharry=cv2.convertScaleAbs(scharry)
scharrxy=cv2.addWeighted(scharrx,0.5,scharry,0.5,0)
laplacian=cv2.Laplacian(im,cv2.CV_64F)
laplacian=cv2.convertScaleAbs(laplacian)
plt.figure(figsize=(30,15))
plt.subplot(221),plt.imshow(im,'gray')
plt.subplot(222),plt.imshow(sobelxy,'gray')
plt.subplot(223),plt.imshow(scharrxy,'gray')
plt.subplot(224),plt.imshow(laplacian,'gray')
plt.show()

Canny 边缘检测
.............................【乙】
更多推荐


所有评论(0)