图片读取 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    边缘检测

.............................【乙】

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐