OpenCV-Python图像处理基础知识

代码0:

OpenCV-python图像处理处理图像问题的一般流程:
A、读入彩色图像;
B、滤波去噪,比如高斯滤波和均值滤波;
C、将三通道彩色图像进行灰度化,如果有必要再进行滤波操作;
D、将灰度化的图像进行二值化;
D、将二值化的图像进行形态学操作(比如腐蚀、膨胀、开运算和闭运算)对目标区域与非目标区进行进一步划分;
E、对目标区域进行边缘检测(例如Canny);
F、对目标区域进行轮廓提取;
G、对目标区域进行绘制矩形框标定和计算距离或者其它测量;
H、对检测的区域进行文字标定;


代码1:

import cv2 as cv

img = cv.imread('C:/Users/Lenovo/Desktop/1.jpg') #读图像
cv.namedWindow('new',cv.WINDOW_NORMAL) # 重命名窗口
cv.resizeWindow('new',640,640) #设置显示窗口的大小
cv.imshow('new',img)# 显示窗口
key =cv.waitKey(0)
if key == ord('q'):
    exit()

代码2:
import cv2 as cv

img = cv.imread('C:/Users/Lenovo/Desktop/1.jpg') #读图像
cv.namedWindow('new',cv.WINDOW_NORMAL)
cv.resizeWindow('new',640,640)
cv.imshow('new',img)
key =cv.waitKey(0)
if key == ord('q'):
    cv.destroyAllWindows()

代码3:
import cv2 as cv
def cv_show(name,img): #显示函数封装
    cv.namedWindow('new', cv.WINDOW_NORMAL)
    cv.resizeWindow('new', 640, 640)
    cv.imshow('new', img)
    key = cv.waitKey(0)
    if key == ord('q'):
        cv.destroyAllWindows()

img = cv.imread('C:/Users/Lenovo/Desktop/1.jpg') #读图像
cv_show('image',img)


代码4:

# 打开摄像头
import cv2
cv2.namedWindow('Video',cv2.WINDOW_NORMAL)
cv2.resizeWindow('Video',640,480)

cap =cv2.VideoCapture(0) #打开摄像头
# 循环读取摄像头每一帧
while True:
    ret, frame =cap.read()
    if not ret: #如果没有正确打开摄像头,则退出
        break

    cv2.imshow('Video',frame)
    key =cv2.waitKey(10)#这里是每帧图像延时10ms
    if key == ord('q'):
        break
cap.release() #别忘释放摄像头资源
cv2.destAllWindows()


代码5:

# 从摄像头中视频录制
import cv2
cap =cv2.VideoCapture(0) #开启摄像头
fourcc =cv2.VideoWriter_fourcc(*'mp4v')

# 创建videowriter
vw =cv2.VideoWriter('output.mp4',fourcc,30,(640,480))

while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break

    # 写每帧数据
    vw.write(frame)
    cv2.imshow('frame', frame)

    if cv2.waitKey(1) == ord('q'):
        break

cap.release()
vw.release()
cv2.destroyAllWindows()


代码6:

# trackbar的使用--调色板的使用
import cv2
import numpy as np

# 创建显示窗口及大小
cv2.namedWindow('trackbar',cv2.WINDOW_NORMAL)
cv2.resizeWindow('trackbar',640,480)

# 定义回调函数
def callback(value):
    # print(value)
     pass

# 创建三个trackbar
cv2.createTrackbar('R','trackbar',0, 255, callback)
cv2.createTrackbar('G','trackbar',0, 255, callback)
cv2.createTrackbar('B','trackbar',0, 255, callback)

#创建背景图片
img =np.zeros((480,640,3),np.uint8)
while True:
    r =cv2.getTrackbarPos('R','trackbar')
    g = cv2.getTrackbarPos('G', 'trackbar')
    b = cv2.getTrackbarPos('B', 'trackbar')

    # 用获取到的三个值修改背景图片颜色
    img[:] = [b, g, r]
    cv2.imshow('trackbar',img)
    key = cv2.waitKey(1)
    if key == ord('q'):
        break

cv2.destroyAllWindows()


代码7:
# OpenCV颜色空间转换
import cv2

def callback(value):
    pass

cv2.namedWindow('color',cv2.WINDOW_NORMAL)
cv2.resizeWindow('color',640,480)

img = cv2.imread('C:/Users/Lenovo/Desktop/1.jpg')
# 定义颜色空间转化列表
color_spaces =[
    cv2.COLOR_BGR2RGBA, cv2.COLOR_BGR2BGRA,
    cv2.COLOR_BGR2GRAY, cv2.COLOR_BGR2HSV,
    cv2.COLOR_BGR2YUV
]

# 设置trackbar
cv2.createTrackbar('trackbar', 'color', 0, 4, callback)

while True:
    # 获取trackbar的值
    index = cv2.getTrackbarPos('trackbar', 'color')
    # 进行颜色空间转换
    cvt_img =cv2.cvtColor(img, color_spaces[index])
    cv2.imshow('color', cvt_img)
    key = cv2.waitKey(10)
    if key == ord('q'):
       break
cv2.destroyAllWindows()


代码8:

# OpenCV复制
import cv2
import numpy as np

img =cv2.imread('C:/Users/Lenovo/Desktop/1.jpg')

#浅拷贝
img2 =img.view()

#深拷贝
img3 =img.copy()

img[10:100, 10:100] =[0, 0, 255] #BGR,red
# cv2.imshow('res', np.hstack((img,img2,img3))) #横向堆叠显示结果
cv2.imshow('res', np.vstack((img,img2,img3))) #竖向堆叠显示结果
cv2.waitKey(0)
cv2.destroyAllWindows()

代码9:

# 图像的分割与融合
import cv2
import numpy as np

img =np.zeros((200,200,3),np.uint8)

# 分割通道
b, g, r =cv2.split(img)
# 修改一些颜色
b[10:100, 10:100] =255
g[10:100, 10:100] =255

#合并通道
img2 =cv2.merge((b,g,r))
cv2.imshow('b,g',np.hstack((b,g)))
cv2.imshow('res', np.hstack((img,img2)))
cv2.waitKey(0)
cv2.destroyAllWindows()


代码10:

# 绘制线
import cv2
import numpy as np

# 创建纯黑的背景图用来画图形
img =np.zeros((480,640,3),np.uint8)

# line(img,pt1,pt2,color,thickness,lineType,shift)
cv2.line(img,(10,20),(300,400),(0,0,255),5,4)
cv2.line(img,(80,100),(380,480),(0,255,255),5,16)

cv2.imshow('draw',img)
cv2.waitKey(0)
cv2.destroyAllWindows()


代码11:

# 绘制矩形
import cv2
import numpy as np

# 创建纯黑的背景图用来画图形
img =np.zeros((480,640,3),np.uint8)

cv2.rectangle(img,(80,100),(380,380),(0,0,255),5,4) #矩形的左上角点坐标和右下角点坐标,即两个对角点坐标

cv2.imshow('draw',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

代码12:
# 绘制圆
import cv2
import numpy as np

# 创建纯黑的背景图用来画图形
img =np.zeros((480,640,3),np.uint8)

cv2.circle(img,(320,240),50,(0,0,255),5,4) #圆心及半径

cv2.imshow('draw',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

代码13:

# 绘制椭圆
import cv2
import numpy as np

# 创建纯黑的背景图用来画图形
img =np.zeros((480,640,3),np.uint8)

# ellipse(img,中心点,长宽的一半,角度,从哪个角度开始,从哪个角度结束,。。。。。。)
cv2.ellipse(img,(320,240),(100,50), 0, 0, 360, (0,0,255),5,4) #画椭圆

cv2.imshow('draw',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

代码14:

# 绘制显示的文本
import cv2
import numpy as np

# 创建纯黑的背景图用来画图形
img =np.zeros((480,640,3),np.uint8)

# putText(img,text,org,fontFace,fontScale,color[,lineType[,bottomLeftOrigin]])
cv2.putText(img,'Hello Opencv',(50,400),cv2.FONT_HERSHEY_COMPLEX,2,[0,0,255])

cv2.imshow('draw',img)
cv2.waitKey(0)
cv2.destroyAllWindows()


代码15:

# 图像的基本运算:加减乘除
import cv2
import numpy as np

cat =cv2.imread('C:/Users/Lenovo/Desktop/2.jfif')
dog =cv2.imread('C:/Users/Lenovo/Desktop/3.jfif')

print(cat.shape)#显示猫图像的高度、宽度、通道数
print(dog.shape)#显示狗图像的高度、宽度、通道数

# 加法操作要求两张图片的高、宽及通道数相同,add的规则就是两个图对应位置的元素相加,如果超过255时,全部变为255.
# 减法操作为对应位置相减,减完小于0,则统一为0.
# 乘 multiply
# 除 divide
new_img_add = cv2.add(cat,dog)
new_img_subtract =cv2.subtract(cat,dog)
new_img_multiply =cv2.multiply(cat,dog)
new_img_divide =cv2.divide(cat,dog)

# cv2.imshow('res',np.hstack((cat,dog,new_img_add)))
# cv2.imshow('res',np.hstack((cat,dog,new_img_subtract)))
# cv2.imshow('res',np.hstack((cat,dog,new_img_multiply)))
cv2.imshow('res',np.hstack((cat,dog,new_img_divide)))

cv2.waitKey(0)
cv2.destroyAllWindows()

代码16:

# 图像的融合:是指两张图像按照不同权重相加
import cv2
import numpy as np

cat =cv2.imread('C:/Users/Lenovo/Desktop/2.jfif')
dog =cv2.imread('C:/Users/Lenovo/Desktop/3.jfif')

print(cat.shape)#显示猫图像的高度、宽度、通道数
print(dog.shape)#显示狗图像的高度、宽度、通道数

new_img =cv2.addWeighted(cat, 0.7, dog, 0.3, -20)

cv2.imshow('res',np.hstack((dog,new_img)))

cv2.waitKey(0)
cv2.destroyAllWindows()


代码17:

# 图像的位运算
import cv2
import numpy as np

cat =cv2.imread('C:/Users/Lenovo/Desktop/2.jfif')
dog =cv2.imread('C:/Users/Lenovo/Desktop/3.jfif')

# 一张图片的元素按位非操作
cat_not = cv2.bitwise_not(cat)
print('cat:',cat[:2, :2])
print('dog:',dog[:2, :2])
print(cat_not[:2, :2])

# 两张图像在对应位置的元素进行按位与操作
cat_and_dog = cv2.bitwise_and(cat,dog)

# 两张图像的对应元素按照位或操作
cat_or_dog =cv2.bitwise_or(cat,dog)

# cv2.imshow('res',np.hstack((cat,cat_not)))
# cv2.imshow('res',np.hstack((cat,cat_and_dog)))
# cv2.imshow('res',np.hstack((cat_not,cat_and_dog)))
cv2.imshow('res',np.hstack((cat_and_dog,cat_or_dog)))

cv2.waitKey(0)
cv2.destroyAllWindows()


代码18:

# 图像的基本变换:放大缩小、平移旋转
import cv2
import numpy as np

cat =cv2.imread('C:/Users/Lenovo/Desktop/2.jfif')
dog =cv2.imread('C:/Users/Lenovo/Desktop/3.jfif')

# 把猫缩放成和狗一样大
new_cat = cv2.resize(cat,(499,360))# 宽度、高度,其作用可以代替切片,但是整体变化
cv2.imshow('cat',cat)
cv2.imshow('new_cat',new_cat)

new_dog =cv2.resize(dog,(800,800),interpolation=cv2.INTER_NEAREST)
cv2.imshow('dog',dog)
cv2.imshow('new_dog',new_dog)

cv2.waitKey(0)
cv2.destroyAllWindows()


代码19:

# 图像的基本变换:放大缩小、平移旋转
import cv2
import numpy as np

cat =cv2.imread('C:/Users/Lenovo/Desktop/2.jfif')
dog =cv2.imread('C:/Users/Lenovo/Desktop/3.jfif')

# 把猫缩放成和狗一样大
new_cat = cv2.resize(cat,(499,360))# 宽度、高度,其作用可以代替切片,但是整体变化
cv2.imshow('cat',cat)
cv2.imshow('new_cat',new_cat)

new_dog_1 =cv2.resize(dog,(800,800),interpolation=cv2.INTER_NEAREST)
new_dog_2 =cv2.resize(dog,(800,800),interpolation=cv2.INTER_LINEAR)
new_dog_3 =cv2.resize(dog,(800,800),interpolation=cv2.INTER_CUBIC)
new_dog_4 =cv2.resize(dog,(800,800),interpolation=cv2.INTER_AREA)

cv2.imshow('dog',dog)
cv2.imshow('new_dog_1',new_dog_1)
cv2.imshow('new_dog_2',new_dog_2)
cv2.imshow('new_dog_3',new_dog_3)
cv2.imshow('new_dog_4',new_dog_4)

cv2.waitKey(0)
cv2.destroyAllWindows()

代码20:

# 图像的基本变换:放大缩小、平移旋转
import cv2
import numpy as np

cat =cv2.imread('C:/Users/Lenovo/Desktop/2.jfif')
dog =cv2.imread('C:/Users/Lenovo/Desktop/3.jfif')

# 按照在x和y方向的比例进行缩放
new_cat = cv2.resize(cat,dsize=None, fx =0.5, fy =0.5)

cv2.imshow('cat',cat)
cv2.imshow('new_cat',new_cat)

cv2.waitKey(0)
cv2.destroyAllWindows()


代码21:
 
# 图像的基本变换:图像翻转
import cv2
import numpy as np

cat =cv2.imread('C:/Users/Lenovo/Desktop/2.jfif')
dog =cv2.imread('C:/Users/Lenovo/Desktop/3.jfif')

# 翻转 filpCode=0,表示上下翻转;filpCode>0,表示左右翻转;filpCode<0,表示上下左右翻转。
new_cat = cv2.flip(cat,1)

cv2.imshow('new_cat',np.hstack((cat,new_cat)))

cv2.waitKey(0)
cv2.destroyAllWindows()


代码22:

# 图像的基本变换:旋转
import cv2
import numpy as np

cat =cv2.imread('C:/Users/Lenovo/Desktop/2.jfif')
dog =cv2.imread('C:/Users/Lenovo/Desktop/3.jfif')

# 图像旋转,ROTATE_90_CLOCKWISE,表示90度顺时针旋转图片;ROTATE_180,180度;ROTATE_90_COUNTERCLOCKWISE,表示90度逆时针旋转
# new_cat = cv2.rotate(cat,rotateCode=cv2.ROTATE_90_CLOCKWISE)
# new_cat = cv2.rotate(cat,rotateCode=cv2.ROTATE_180)
new_cat = cv2.rotate(cat,rotateCode=cv2.ROTATE_90_COUNTERCLOCKWISE)

cv2.imshow('cat',cat)
cv2.imshow('new_cat',new_cat)

cv2.waitKey(0)
cv2.destroyAllWindows()


代码23:

# 图像的仿射变换之平移
import cv2
import numpy as np

cat =cv2.imread('C:/Users/Lenovo/Desktop/2.jfif')

h,w,ch = cat.shape
M = np.float32([[1,0,200],[0,1,200]])#变换矩阵M
new_cat = cv2.warpAffine(cat,M, dsize=(w,h))

cv2.imshow('cat',cat)
cv2.imshow('new_cat',new_cat)

cv2.waitKey(0)
cv2.destroyAllWindows()

代码24:

# 图像的仿射变换之获取变换矩阵,因为在进行旋转时人工不方便计算变化矩阵
import cv2
import numpy as np

cat =cv2.imread('C:/Users/Lenovo/Desktop/2.jfif')

h,w,ch = cat.shape

#先获取变换矩阵:(100,100)旋转中心,15逆时针旋转角度,1表示不进行缩放
# M = cv2.getRotationMatrix2D((100,100),15,1)
M = cv2.getRotationMatrix2D((w/2,h/2),15,1)

new_cat = cv2.warpAffine(cat,M,(w,h))#再进行仿射变换

cv2.imshow('cat',cat)
cv2.imshow('new_cat',new_cat)

cv2.waitKey(0)
cv2.destroyAllWindows()


代码25:

# 图像的仿射变换之获取变换矩阵:通过三个点,即原始图片上的三个点坐标和变换之后三个对应的三个坐标。
import cv2
import numpy as np
cat =cv2.imread('C:/Users/Lenovo/Desktop/2.jfif')
h,w,ch = cat.shape
# 定义原始图像的坐标点src和变换之后的对应三个点坐标dst,建立三个方程
src =np.float32([[50,100],[80,100],[200,300]])
dst = np.float32([[100,150],[360,200],[280,120]])
M = cv2.getAffineTransform(src,dst) #获取变化矩阵M
new_cat = cv2.warpAffine(cat,M,(w,h))#通过M,进行仿射变换
cv2.imshow('cat',cat)
cv2.imshow('new_cat',new_cat)
cv2.waitKey(0)
cv2.destroyAllWindows()


代码26:

# 图像的透视变换:解决视角矫正问题,比如银行卡放倾斜:需要4个点相互对应
import cv2
import numpy as np

cat =cv2.imread('C:/Users/Lenovo/Desktop/2.jfif')


# 定义原始图像的坐标点src和变换之后的对应四个点坐标dst,建立四个方程
src =np.float32([[10,110],[210,110],[0,400],[250,390]])
dst = np.float32([[0,0],[230,0],[0,300],[230,300]])

M = cv2.getPerspectiveTransform(src,dst) #获取变化矩阵M
new_cat = cv2.warpPerspective(cat,M,(230,300))#通过M,进行透视变换

cv2.namedWindow('cat',cv2.WINDOW_NORMAL)
cv2.resizeWindow('cat',640,480)
cv2.imshow('cat',cat)

cv2.namedWindow('new_cat',cv2.WINDOW_NORMAL)
cv2.resizeWindow('new_cat',640,480)
cv2.imshow('new_cat',new_cat)
cv2.waitKey(0)
cv2.destroyAllWindows()


代码27:

# 卷积操作过滤器
import cv2
import numpy as np

cat =cv2.imread('C:/Users/Lenovo/Desktop/2.jfif')

# kernel必须是float型
kernel =np.ones((5,5),np.float32)/25 #相当于平均滤波
dst= cv2.filter2D(cat,-1,kernel)


cv2.namedWindow('cat',cv2.WINDOW_NORMAL)
cv2.resizeWindow('cat',640,480)
cv2.imshow('cat',cat)

cv2.namedWindow('new_cat',cv2.WINDOW_NORMAL)
cv2.resizeWindow('new_cat',640,480)
cv2.imshow('new_cat',dst)

cv2.waitKey(0)
cv2.destroyAllWindows()


代码28:

# 卷积操作过滤器
import cv2
import numpy as np

cat =cv2.imread('C:/Users/Lenovo/Desktop/2.jfif')

# kernel必须是float型
# kernel =np.ones((5,5),np.float32)/25 #相当于平均滤波

# kernel =np.array([[-1,-1,-1],[-1,8,-1],[-1,-1,-1]])
kernel =np.array([[-2,1,0],[-1,1,1],[0,1,2]])
dst= cv2.filter2D(cat,-1,kernel)


cv2.namedWindow('cat',cv2.WINDOW_NORMAL)
cv2.resizeWindow('cat',640,480)
cv2.imshow('cat',cat)

cv2.namedWindow('new_cat',cv2.WINDOW_NORMAL)
cv2.resizeWindow('new_cat',640,480)
cv2.imshow('new_cat',dst)

cv2.waitKey(0)
cv2.destroyAllWindows()

代码29:

# 卷积操作过滤器
import cv2
import numpy as np

cat =cv2.imread('C:/Users/Lenovo/Desktop/2.jfif')
cat = cv2.cvtColor(cat,cv2.COLOR_BGR2GRAY)
# kernel必须是float型
# kernel =np.ones((5,5),np.float32)/25 #相当于平均滤波

# kernel =np.array([[-1,-1,-1],[-1,8,-1],[-1,-1,-1]]) #边缘卷积核
# kernel =np.array([[-2,1,0],[-1,1,1],[0,1,2]]) # 浮雕卷积核
kernel =np.array([[0,-1,0],[-1,5,-1],[0,-1,0]]) # 锐化卷积核,需要将彩色改成灰度图
dst= cv2.filter2D(cat,-1,kernel)


cv2.namedWindow('cat',cv2.WINDOW_NORMAL)
cv2.resizeWindow('cat',640,480)
cv2.imshow('cat',cat)

cv2.namedWindow('new_cat',cv2.WINDOW_NORMAL)
cv2.resizeWindow('new_cat',640,480)
cv2.imshow('new_cat',dst)

cv2.waitKey(0)
cv2.destroyAllWindows()


代码30:

# 方盒滤波和均值滤波
import cv2
import numpy as np

cat =cv2.imread('C:/Users/Lenovo/Desktop/2.jfif')

#不需要手动创建卷积核,只需要方盒滤波的卷积核大小
# dst = cv2.boxFilter(cat,-1,(5,5),normalize=True) #方盒跟kernel一样的结果

# 均值滤波:没有位深ddpeth这个参数
dst =cv2.blur(cat,(5,5))

cv2.namedWindow('cat',cv2.WINDOW_NORMAL)
cv2.resizeWindow('cat',640,480)
cv2.imshow('cat',cat)

cv2.namedWindow('new_cat',cv2.WINDOW_NORMAL)
cv2.resizeWindow('new_cat',640,480)
cv2.imshow('new_cat',dst)

cv2.waitKey(0)
cv2.destroyAllWindows()


代码31:

# 高斯滤波:专门去除东一堆西一堆的高斯噪声
import cv2
import numpy as np

cat =cv2.imread('C:/Users/Lenovo/Desktop/2.jfif')

dst =cv2.GaussianBlur(cat,(5,5),sigmaX=3) #高斯是元组(5,5)类型,不是数值5

cv2.namedWindow('cat',cv2.WINDOW_NORMAL)
cv2.resizeWindow('cat',640,480)
cv2.imshow('cat',cat)

cv2.namedWindow('new_cat',cv2.WINDOW_NORMAL)
cv2.resizeWindow('new_cat',640,480)
cv2.imshow('new_cat',dst)

cv2.waitKey(0)
cv2.destroyAllWindows()


代码32:

# 中值滤波:专门去除分布均匀的椒盐噪声
import cv2
import numpy as np

cat =cv2.imread('C:/Users/Lenovo/Desktop/2.jfif')

dst =cv2.medianBlur(cat,9) #中值滤波是卷积核是数字5,而高斯滤波是元组类型。

cv2.namedWindow('cat',cv2.WINDOW_NORMAL)
cv2.resizeWindow('cat',640,480)
cv2.imshow('cat',cat)

cv2.namedWindow('new_cat',cv2.WINDOW_NORMAL)
cv2.resizeWindow('new_cat',640,480)
cv2.imshow('new_cat',dst)

cv2.waitKey(0)
cv2.destroyAllWindows()


代码33:

# 双边滤波:在高斯滤波的基础上考虑了边缘灰度值(空间距离+灰度距离),其作用是能够局部降噪并且很好地保留边缘信息。
import cv2
import numpy as np

cat =cv2.imread('C:/Users/Lenovo/Desktop/2.jfif')

dst =cv2.bilateralFilter(cat,7,20,50) # 数值7表示高斯卷积核大小,20为灰度距离的标准差,50为空间距离(高斯)的标准差

cv2.namedWindow('cat',cv2.WINDOW_NORMAL)
cv2.resizeWindow('cat',640,480)
cv2.imshow('cat',cat)

cv2.namedWindow('new_cat',cv2.WINDOW_NORMAL)
cv2.resizeWindow('new_cat',640,480)
cv2.imshow('new_cat',dst)

cv2.waitKey(0)
cv2.destroyAllWindows()


代码34:

# Sobel算子
import cv2
import numpy as np

img =cv2.imread('C:/Users/Lenovo/Desktop/2.jfif')

# 计算X方向的梯度,X方向没有了,只有Y方向的格子
dx =cv2.Sobel(img, cv2.CV_64F,dx =1, dy =0, ksize =3)
# 计算Y方向的梯度,Y方向没有了,只有X方向的格子
dy =cv2.Sobel(img, cv2.CV_64F,dx =0, dy =1, ksize =3)

# dst =cv2.add(dx,dy)
dst =cv2.addWeighted(dx, 0.5, dy, 0.5,gamma =0)
cv2.imshow('dx',dx)
cv2.imshow('dy',dy)
cv2.imshow('dst',dst)

cv2.waitKey(0)
cv2.destroyAllWondows()

代码35:

# Scharr算子
import cv2
import numpy as np

img =cv2.imread('C:/Users/Lenovo/Desktop/2.jfif')

# 计算X方向的梯度,X方向没有了,只有Y方向的格子
dx =cv2.Scharr(img, cv2.CV_64F,dx =1, dy =0)
# 计算Y方向的梯度,Y方向没有了,只有X方向的格子
dy =cv2.Scharr(img, cv2.CV_64F,dx =0, dy =1)

# dst =cv2.add(dx,dy)
dst =cv2.addWeighted(dx, 0.5, dy, 0.5,gamma =0)

cv2.imshow('dx',dx)
cv2.imshow('dy',dy)
cv2.imshow('dst',dst)

cv2.waitKey(0)
cv2.destroyAllWondows()


代码36:
# 拉普拉斯算子:是一种基于二阶导数边缘检测的算子,很容易受噪声的影响,先高斯去噪,然后在拉普拉斯检测边缘
import cv2
import numpy as np

img =cv2.imread('C:/Users/Lenovo/Desktop/2.jfif')
dst =cv2.Laplacian(img,-1,ksize =3)

cv2.imshow('dst',dst)
cv2.waitKey(0)
cv2.destroyAllWondows()

代码37:

# Canny算子边缘检测算子:(相对最好的边缘检测算子)
import cv2
import numpy as np

img =cv2.imread('C:/Users/Lenovo/Desktop/2.jfif')
dst =cv2.Canny(img,80,150) # 阈值越小,细节越丰富

cv2.imshow('dst',dst)
cv2.waitKey(0)
cv2.destroyAllWondows()

代码38:

# 图像全局二值化-阈值二值化(一般用这个二值化)
import cv2
import numpy as np

img =cv2.imread('C:/Users/Lenovo/Desktop/2.jfif') #读入彩色图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #灰度化
thresh, dst =cv2.threshold(gray,127,255,cv2.THRESH_BINARY) # 二值化,用的最多,会返回阈值和二值化处理后的图片

cv2.imshow('gray',gray)
cv2.imshow('dst',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

代码39:

# 自适应阈值二值化(这个阈值二值化比较智能,当全局阈值化不行时可以尝试这个阈值化)
import cv2
import numpy as np

img =cv2.imread('C:/Users/Lenovo/Desktop/2.jfif') #读入彩色图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #灰度化
dst =cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,9,0) # 自适应阈值二值化,只会返回二值化处理后的图片

cv2.imshow('gray',gray)
cv2.imshow('dst',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

代码40:
# 腐蚀形态学操作,只有卷积核内卷积时的图像全为白色才为白色,否则为黑色。
import cv2
import numpy as np

img =cv2.imread('C:/Users/Lenovo/Desktop/2.jfif') #读入彩色图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #灰度化
# 定义卷积核
kernel = np.ones((3,3),np.uint8)
dst =cv2.erode(gray,kernel,iterations=2) # 腐蚀操作,可以直接处理彩色图或者灰度图也可以

cv2.imshow('gray',gray)
cv2.imshow('dst',dst)

cv2.waitKey(0)
cv2.destroyAllWindows()

代码41:

# 腐蚀形态学操作,只有卷积核内卷积时的图像全为白色才为白色,否则为黑色。
import cv2
import numpy as np

img =cv2.imread('C:/Users/Lenovo/Desktop/2.jfif') #读入彩色图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #灰度化
thresh, dst1 =cv2.threshold(gray,127,255,cv2.THRESH_BINARY) # 二值化,用的最多,会返回阈值和二值化处理后的图片

# 定义卷积核
kernel = np.ones((3,3),np.uint8)
dst =cv2.erode(dst1,kernel,iterations=2) # 腐蚀操作,可以直接处理彩色图、灰度图、二值化图


cv2.imshow('gray',gray)
cv2.imshow('thresh',dst1)
cv2.imshow('erode',dst)

cv2.waitKey(0)
cv2.destroyAllWindows()

代码42:

# 获取形态学卷积核
import cv2
import numpy as np

kernel_rect =cv2.getStructuringElement(cv2.MORPH_RECT,(15,15))#矩形形状5x5全为1的卷积核
kernel_ellipse =cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(15,15)) #椭圆形状5x5全为1的卷积核
kernel_cross =cv2.getStructuringElement(cv2.MORPH_CROSS,(15,15)) #十字架形状5x5全为1的卷积核
print(kernel_rect)
print(kernel_ellipse)
print(kernel_rect)

代码43:

# 腐蚀形态学操作,只有卷积核内卷积时的图像全为白色才为白色,否则为黑色。(目的是让噪声区域减小)
import cv2
import numpy as np

img =cv2.imread('C:/Users/Lenovo/Desktop/2.jfif') #读入彩色图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #灰度化
thresh, dst1 =cv2.threshold(gray,127,255,cv2.THRESH_BINARY) # 阈值二值化,用的最多,会返回阈值和二值化处理后的图片数据

# 定义卷积核
# kernel = np.ones((3,3),np.uint8)
kernel =cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))#矩形形状3x3全为1的卷积核
dst =cv2.erode(dst1,kernel,iterations=2) # 腐蚀操作,可以直接处理彩色图、灰度图、二值化图

# cv2.imshow('gray',gray)
cv2.imshow('thresh',dst1)
cv2.imshow('erode',dst)

cv2.waitKey(0)
cv2.destroyAllWindows()

代码44:

# 膨胀形态学操作,只有卷积核内卷积时的图像全为黑色才为黑色,否则为白色。(让目标区域变大和连贯)
# 膨胀是腐蚀的相反操作,基本原理是只要保证卷积核的锚点是非0值,周边无论是0还是非0值,都变成非0值.
import cv2
import numpy as np

img =cv2.imread('C:/Users/Lenovo/Desktop/2.jfif') #读入彩色图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #灰度化
thresh, dst1 =cv2.threshold(gray,127,255,cv2.THRESH_BINARY) # 阈值二值化,用的最多,会返回阈值和二值化处理后的图片数据

# 定义卷积核
# kernel = np.ones((3,3),np.uint8)
kernel =cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))#矩形形状3x3全为1的卷积核
dst =cv2.dilate(dst1,kernel,iterations=2) # 膨胀操作,可以直接处理彩色图、灰度图、二值化图

# cv2.imshow('gray',gray)
cv2.imshow('thresh',dst1)
cv2.imshow('dilate',dst)

cv2.waitKey(0)
cv2.destroyAllWindows()


代码45:

# 腐蚀和膨胀的结合.
import cv2
import numpy as np

img =cv2.imread('C:/Users/Lenovo/Desktop/2.jfif') #读入彩色图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #灰度化
thresh, dst1 =cv2.threshold(gray,127,255,cv2.THRESH_BINARY) # 阈值二值化,用的最多,会返回阈值和二值化处理后的图片数据

# 定义卷积核
kernel =cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))#矩形形状3x3全为1的卷积核
dst2 =cv2.erode(dst1,kernel,iterations=2) # 腐蚀操作,可以直接处理彩色图、灰度图、二值化图
dst3 =cv2.dilate(dst2,kernel,iterations=2) # 膨胀操作,可以直接处理彩色图、灰度图、二值化图

# cv2.imshow('gray',gray)
cv2.imshow('thresh',dst1)
cv2.imshow('erode',dst2)
cv2.imshow('erode+dilate',dst3)

cv2.waitKey(0)
cv2.destroyAllWindows()


代码46:

# 形态学开运算:先腐蚀erode再膨胀dilate,(用于去除目标区域外部的噪声)
import cv2
import numpy as np

img =cv2.imread('C:/Users/Lenovo/Desktop/2.jfif') #读入彩色图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #灰度化
thresh, dst1 =cv2.threshold(gray,127,255,cv2.THRESH_BINARY) # 阈值二值化,用的最多,会返回阈值和二值化处理后的图片数据

# 定义卷积核
kernel =cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))#矩形形状3x3全为1的卷积核
dst2 =cv2.morphologyEx(dst1, cv2.MORPH_OPEN,kernel,iterations =2) # 开运算

# cv2.imshow('gray',gray)
cv2.imshow('thresh',dst1)
cv2.imshow('erode',dst2)


cv2.waitKey(0)
cv2.destroyAllWindows()


代码47:

# 形态学闭运算:先膨胀dilate再腐蚀erode,(用于去除目标区域内部的噪声)
import cv2
import numpy as np

img =cv2.imread('C:/Users/Lenovo/Desktop/2.jfif') #读入彩色图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #灰度化
thresh, dst1 =cv2.threshold(gray,127,255,cv2.THRESH_BINARY) # 阈值二值化,用的最多,会返回阈值和二值化处理后的图片数据

# 定义卷积核
kernel =cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))#矩形形状3x3全为1的卷积核
dst2 =cv2.morphologyEx(dst1, cv2.MORPH_CLOSE,kernel,iterations =2) # 闭运算

# cv2.imshow('gray',gray)
cv2.imshow('thresh',dst1)
cv2.imshow('close',dst2)


cv2.waitKey(0)
cv2.destroyAllWindows()


代码48:

# 形态学梯度:原图减去腐蚀后的图,腐蚀之后原图边缘变小了,原图-腐蚀就可以得到腐蚀掉的部分,即边缘。
import cv2
import numpy as np

img =cv2.imread('C:/Users/Lenovo/Desktop/2.jfif') #读入彩色图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #灰度化
thresh, dst1 =cv2.threshold(gray,127,255,cv2.THRESH_BINARY) # 阈值二值化,用的最多,会返回阈值和二值化处理后的图片数据

# 定义卷积核
kernel =cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))#矩形形状3x3全为1的卷积核
dst2 =cv2.morphologyEx(dst1, cv2.MORPH_GRADIENT,kernel,iterations =2) # 形态学梯度

# cv2.imshow('gray',gray)
cv2.imshow('thresh',dst1)
cv2.imshow('close',dst2)

cv2.waitKey(0)
cv2.destroyAllWindows()


代码49:

# 顶帽运算:顶帽 =原图-开运算
# 开运算的效果是去除图形外的噪声。原图-开运算就得到了去掉的噪声。
import cv2
import numpy as np

img =cv2.imread('C:/Users/Lenovo/Desktop/2.jfif') #读入彩色图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #灰度化
thresh, dst1 =cv2.threshold(gray,127,255,cv2.THRESH_BINARY) # 阈值二值化,用的最多,会返回阈值和二值化处理后的图片数据

# 定义卷积核
kernel =cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))#矩形形状3x3全为1的卷积核
dst2 =cv2.morphologyEx(dst1, cv2.MORPH_TOPHAT,kernel,iterations =2) # 顶帽

# cv2.imshow('gray',gray)
cv2.imshow('thresh',dst1)
cv2.imshow('tophat',dst2)

cv2.waitKey(0)
cv2.destroyAllWindows()


代码50:

# 黑帽运算:黑帽 =原图-闭运算
# 开运算的效果是去除图形内部的噪声。原图-闭运算就得到了去掉内部的噪声。
import cv2
import numpy as np

img =cv2.imread('C:/Users/Lenovo/Desktop/2.jfif') #读入彩色图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #灰度化
thresh, dst1 =cv2.threshold(gray,127,255,cv2.THRESH_BINARY) # 阈值二值化,用的最多,会返回阈值和二值化处理后的图片数据

# 定义卷积核
kernel =cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))#矩形形状3x3全为1的卷积核
dst2 =cv2.morphologyEx(dst1, cv2.MORPH_BLACKHAT,kernel,iterations =2) # 顶帽

# cv2.imshow('gray',gray)
cv2.imshow('thresh',dst1)
cv2.imshow('tophat',dst2)

cv2.waitKey(0)
cv2.destroyAllWindows()

代码51:

# 查找轮廓 contours, hierarchy =cv2.findContours(dst1,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
import cv2
import numpy as np

img =cv2.imread('C:/Users/Lenovo/Desktop/2.jfif') #读入彩色图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #灰度化
thresh, dst1 =cv2.threshold(gray,127,255,cv2.THRESH_BINARY) # 阈值二值化,用的最多,会返回阈值和二值化处理后的图片数据

# 查找轮廓
contours, hierarchy =cv2.findContours(dst1,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)


print(type(contours)) #contours是列表,而不是ndarray,里面放的是ndarray,每个ndarray放着coutours
print(contours)
print(hierarchy)

cv2.imshow('thresh',dst1)

cv2.waitKey(0)
cv2.destroyAllWindows()


代码52:

# 查找轮廓 + 绘制轮廓
import cv2
import numpy as np

img =cv2.imread('C:/Users/Lenovo/Desktop/2.jfif') #读入彩色图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #灰度化
thresh, dst1 =cv2.threshold(gray,127,255,cv2.THRESH_BINARY) # 阈值二值化,用的最多,会返回阈值和二值化处理后的图片数据

# 查找轮廓
contours, hierarchy =cv2.findContours(dst1,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
#绘制轮廓会直接修改原图,如果想保持原图不变,建议copy一份。
img_copy =img.copy()
#绘制查找到的轮廓,这里直接绘制在img_copy图片上了,而没有在img原图
cv2.drawContours(img_copy,contours,-1,(0,0,255),2)


cv2.imshow('img',img)#显示原图
cv2.imshow('img_copy',img_copy) #显示在img_copy绘制的轮廓

cv2.waitKey(0)
cv2.destroyAllWindows()


代码53:

# 计算轮廓面积和轮廓周长,单位是像素点
import cv2
import numpy as np

img =cv2.imread('C:/Users/Lenovo/Desktop/2.jfif') #读入彩色图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #灰度化
thresh, dst1 =cv2.threshold(gray,127,255,cv2.THRESH_BINARY) # 阈值二值化,用的最多,会返回阈值和二值化处理后的图片数据

# 查找轮廓
contours, hierarchy =cv2.findContours(dst1,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
#绘制轮廓会直接修改原图,如果想保持原图不变,建议copy一份。
img_copy =img.copy()
#绘制查找到的轮廓,这里直接绘制在img_copy图片上了,而没有在img原图
cv2.drawContours(img_copy,contours,-1,(0,0,255),2)

#计算轮廓面积
area = cv2.contourArea(contours[20])
print('area',area)
#计算轮廓周长
perimeter = cv2.arcLength(contours[20],closed=True)
print('perimeter',perimeter)

cv2.imshow('img',img)#显示原图
cv2.imshow('img_copy',img_copy) #显示在img_copy绘制的轮廓

cv2.waitKey(0)
cv2.destroyAllWindows()

代码54:

# 多边形逼近和凸包
import cv2
import numpy as np

img =cv2.imread('C:/Users/Lenovo/Desktop/hand.png') #读入彩色图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #灰度化
thresh, dst1 =cv2.threshold(gray,127,255,cv2.THRESH_BINARY) # 阈值二值化,用的最多,会返回阈值和二值化处理后的图片数据

# 查找轮廓
contours, hierarchy =cv2.findContours(dst1,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
#绘制轮廓会直接修改原图,如果想保持原图不变,建议copy一份。
img_copy =img.copy()
#绘制查找到的轮廓,这里直接绘制在img_copy图片上了,而没有在img原图
cv2.drawContours(img_copy,contours,0,(0,0,255),2) #绘制的真实轮廓

# 使用多边形逼近,近似模拟手的轮廓
approx =cv2.approxPolyDP(contours[0],20,closed=True) #这个数值20就是多项式阈值
# approx本质上就是一个轮廓数据
# 绘制近似逼近approx的轮廓
cv2.drawContours(img_copy,[approx],0,(0,255,0),2)

cv2.imshow('img',img)#显示原图
cv2.imshow('img_copy',img_copy) #显示在img_copy绘制的轮廓
cv2.waitKey(0)
cv2.destroyAllWindows()

代码55:

# 多边形逼近和凸包
import cv2
import numpy as np

img =cv2.imread('C:/Users/Lenovo/Desktop/hand.png') #读入彩色图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #灰度化
thresh, dst1 =cv2.threshold(gray,127,255,cv2.THRESH_BINARY) # 阈值二值化,用的最多,会返回阈值和二值化处理后的图片数据

# 查找轮廓 方法一
contours, hierarchy =cv2.findContours(dst1,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
#绘制轮廓会直接修改原图,如果想保持原图不变,建议copy一份。
img_copy =img.copy()
#绘制查找到的轮廓,这里直接绘制在img_copy图片上了,而没有在img原图
cv2.drawContours(img_copy,contours,0,(0,0,255),2) #绘制的查找到的轮廓

# 使用多边形逼近,近似模拟手的轮廓  方法二
approx =cv2.approxPolyDP(contours[0],20,closed=True) #这个数值20就是多项式阈值
# approx本质上就是一个轮廓数据
cv2.drawContours(img_copy,[approx],0,(0,255,0),2)# 绘制近似逼近approx的轮廓

# 使用凸包近似逼近,模拟手的轮廓   方法三
hull = cv2.convexHull(contours[0]) #计算凸包
cv2.drawContours(img_copy,[hull],0,(255,0,0),2) #绘制凸包方法的轮廓


cv2.imshow('img',img)#显示原图
cv2.imshow('img_copy',img_copy) #显示在img_copy绘制的轮廓
cv2.waitKey(0)
cv2.destroyAllWindows()


代码56:

# 最小外接矩形
import cv2
import numpy as np

img =cv2.imread('C:/Users/Lenovo/Desktop/rect.png') #读入彩色图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #灰度化
thresh, dst1 =cv2.threshold(gray,127,255,cv2.THRESH_BINARY) # 阈值二值化,用的最多,会返回阈值和二值化处理后的图片数据

# 查找轮廓
contours, hierarchy =cv2.findContours(dst1,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
#绘制轮廓会直接修改原图,如果想保持原图不变,建议copy一份。
img_copy =img.copy()
rect = cv2.minAreaRect(contours[1]) #查找及挖掘轮廓contours[1]中的最小外接矩形,而不是绘制最小外接矩形,rect是一个旋转的矩形,是由矩形的起始坐标x,y,矩形的长宽,以及矩形的旋转角度(rad)组成
print(rect) #打印最小外接矩形rect内容
# 注意的是坐标点必须是整数
box = cv2.boxPoints(rect) # 这里是帮助我们将rect中旋转矩形的4个坐标点计算出来
print(box)  #打印box内容
# 为了避免较大偏差,四舍五入
box =np.round(box).astype('int64')
box =np.int0(box) #然后再转化成整数
cv2.drawContours(img_copy,[box],0,(255,0,0),2) #绘制由box四个坐标点围成的矩形

cv2.imshow('img',img)#显示原图
cv2.imshow('img_copy',img_copy) #显示在img_copy绘制的轮廓
cv2.waitKey(0)
cv2.destroyAllWindows()


代码57:

# 最小外接矩形和最大外接矩形
import cv2
import numpy as np

img =cv2.imread('C:/Users/Lenovo/Desktop/rect.png') #读入彩色图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #灰度化
thresh, dst1 =cv2.threshold(gray,127,255,cv2.THRESH_BINARY) # 阈值二值化,用的最多,会返回阈值和二值化处理后的图片数据

# 查找轮廓
contours, hierarchy =cv2.findContours(dst1,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
#绘制轮廓会直接修改原图,如果想保持原图不变,建议copy一份。
img_copy =img.copy()
rect = cv2.minAreaRect(contours[1]) #查找及挖掘轮廓contours[1]中的最小外接矩形,而不是绘制最小外接矩形,rect是一个旋转的矩形,是由矩形的起始坐标x,y,矩形的长宽,以及矩形的旋转角度(rad)组成
print(rect) #打印最小外接矩形rect内容
# 注意的是坐标点必须是整数
box = cv2.boxPoints(rect) # 这里是帮助我们将rect中旋转矩形的4个坐标点计算出来
print(box)  #打印box内容
# 为了避免较大偏差,四舍五入
box =np.round(box).astype('int64')
box =np.int0(box) #然后再转化成整数
cv2.drawContours(img_copy,[box],0,(255,0,0),2) #绘制由box四个坐标点围成的矩形

# 最大外接矩形,就是方方正正的矩形,返回起始点的坐标x,y 和(w,h)
x,y,w,h = cv2.boundingRect(contours[1])
cv2.rectangle(img_copy,(x,y),(x + w, y + h),(0,255,0),2) #绘制最大外接矩形

cv2.imshow('img',img)#显示原图
cv2.imshow('img_copy',img_copy) #显示在img_copy绘制的轮廓
cv2.waitKey(0)
cv2.destroyAllWindows()


代码58:

# 图像金字塔之高斯金字塔:向下采样是指粗暴地去除偶数行和列的方法
import cv2
import numpy as np

img =cv2.imread('C:/Users/Lenovo/Desktop/lena.png') #读入彩色图像

print(img.shape)
dst = cv2.pyrDown(img) #分辨率减小的操作,下采样(朝着金字塔的顶尖的方向)---高斯下采样
print(dst.shape)
dst2 = cv2.pyrDown(dst) #再进行一次下采样
print(dst2.shape)

cv2.imshow('img',img)
cv2.imshow('dst',dst)
cv2.imshow('dst2',dst2)

cv2.waitKey(0)
cv2.destroyAllWindows()


代码59:

# 图像金字塔之高斯金字塔:向上采样是指粗暴地添加偶数行和列的方法
import cv2
import numpy as np

img =cv2.imread('C:/Users/Lenovo/Desktop/lena.png') #读入彩色图像

print(img.shape)
dst = cv2.pyrUp(img) #分辨率增大的操作,上采样(朝着金字塔的底部的方向)---高斯上采样
print(dst.shape)
dst2 = cv2.pyrUp(dst) #再进行一次上采样
print(dst2.shape)

cv2.imshow('img',img)
cv2.imshow('dst',dst)
cv2.imshow('dst2',dst2)

cv2.waitKey(0)
cv2.destroyAllWindows()


代码60:

# 拉普拉斯金字塔:原始图像减去先下采样再上采样的图像
import cv2
import numpy as np

img =cv2.imread('C:/Users/Lenovo/Desktop/lena.png') #读入彩色图像

# 先下采样缩小照片
dst1 = cv2.pyrDown(img) #分辨率增大的操作,上采样(朝着金字塔的底部的方向)---高斯上采样
# 再上采样放大照片
dst2 = cv2.pyrUp(dst1) #再进行一次上采样
# 原图-dst2
lap0 = img - dst2 # 第一层的拉普拉斯结果


# 第二层拉普拉斯
# 先下采样缩小照片
dst3 = cv2.pyrDown(dst2) #分辨率增大的操作,上采样(朝着金字塔的底部的方向)---高斯上采样
# 再上采样放大照片
dst4 = cv2.pyrUp(dst3) #再进行一次上采样
# 原图-dst2
lap1 = dst2 - dst4 # 第一层的拉普拉斯结果


cv2.imshow('img',img)
cv2.imshow('lap0',lap0)
cv2.imshow('lap1',lap1)


cv2.waitKey(0)
cv2.destroyAllWindows()

代码61:

# Opencv 统计直方图
import cv2
import numpy as np
import matplotlib.pyplot as plt

img =cv2.imread('C:/Users/Lenovo/Desktop/lena.png') #读入彩色图像
hist_B = cv2.calcHist([img],[0],None,[256],[0,255]) #直方图统计, B
hist_G= cv2.calcHist([img],[1],None,[256],[0,255]) #直方图统计, G
hist_R= cv2.calcHist([img],[2],None,[256],[0,255]) #直方图统计, R
plt.plot(hist_B,color='b',label ='blue')
plt.plot(hist_G,color='g',label ='green')
plt.plot(hist_R,color='r',label = 'red')
plt.legend()
plt.show()

cv2.waitKey(0)
cv2.destroyAllWindows()

代码62:

# 直方图均衡化
import cv2
import numpy as np
import matplotlib.pyplot as plt

img =cv2.imread('C:/Users/Lenovo/Desktop/lena.png') #读入彩色图像
gray =cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #灰度化

# lena变黑
gray_back =gray - 40
#lena 变亮
gray_bright =gray + 40

cv2.imshow('lenna',np.hstack((gray,gray_back,gray_bright)))

# 查看各自的直方图
hist_gray = cv2.calcHist([gray],[0],None,[256],[0,255])
hist_back = cv2.calcHist([gray_back],[0],None,[256],[0,255])
hist_bright = cv2.calcHist([gray_bright],[0],None,[256],[0,255])

#绘制直方图
plt.plot(hist_gray,label ='gray')
plt.plot(hist_back,label ='dark')
plt.plot(hist_back,label ='bright')
plt.legend()
plt.show()


# 直方图均衡化处理
dark_equ = cv2.equalizeHist(gray_back)
bright_equ = cv2.equalizeHist(gray_bright)
cv2.imshow('gray_dark and dark_equ',np.hstack((gray_back,dark_equ)))
cv2.imshow('gray_bright and bright_equ',np.hstack((gray_bright,bright_equ)))

cv2.waitKey(0)
cv2.destroyAllWindows()

代码63:

# 直方图均衡化
import cv2
import numpy as np
import matplotlib.pyplot as plt

img =cv2.imread('C:/Users/Lenovo/Desktop/lena.png') #读入彩色图像
gray =cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #灰度化

# lena变黑
gray_back =gray - 40
#lena 变亮
gray_bright =gray + 40

cv2.imshow('lenna',np.hstack((gray,gray_back,gray_bright)))

# 查看各自的直方图
hist_gray = cv2.calcHist([gray],[0],None,[256],[0,255])
hist_back = cv2.calcHist([gray_back],[0],None,[256],[0,255])
hist_bright = cv2.calcHist([gray_bright],[0],None,[256],[0,255])

#绘制直方图
plt.plot(hist_gray,label ='gray')
plt.plot(hist_back,label ='dark')
plt.plot(hist_back,label ='bright')
plt.legend()
plt.show()

# 进行均衡化处理
dark_equ = cv2.equalizeHist(gray_back)
bright_equ = cv2.equalizeHist(gray_bright)
cv2.imshow('gray_dark and dark_equ',np.hstack((gray_back,dark_equ)))
cv2.imshow('gray_bright and bright_equ',np.hstack((gray_bright,bright_equ)))
# 查看均衡化的直方图
dark_equ = cv2.calcHist([dark_equ],[0],None,[256],[0,255])
bright_equ = cv2.calcHist([bright_equ],[0],None,[256],[0,255])
plt.plot(dark_equ,label ='dark_equ')
plt.plot(bright_equ,label ='bright_equ')
plt.legend()
plt.show()

cv2.waitKey(0)
cv2.destroyAllWindows()


代码64:

# 掩膜方法的直方图,就是指感兴趣的目标区域的直方图
import cv2
import numpy as np
import matplotlib.pyplot as plt

img =cv2.imread('C:/Users/Lenovo/Desktop/lena.png') #读入彩色图像
gray =cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #灰度化

# 生成掩膜图像
mask = np.zeros(gray.shape,np.uint8)

# 设置想要统计直方图的区域
mask[50:150, 100:200] = 255
# 掩膜后的目标区域
mask_region = cv2.bitwise_and(gray,gray,mask =mask)

cv2.imshow('gray',gray)
cv2.imshow('mask',mask)
cv2.imshow('mask_region',mask_region)

cv2.waitKey(0)
cv2.destroyAllWindows()


代码65:***车辆统计项目: https://www.bilibili.com/video/BV12Z4y1z7jb?p=67&vd_source=9896432c8d2da3eee75b86d9ef464d8b
65-1加载视频:
# 加载视频
import  cv2
import numpy as np
cap =cv2.VideoCapture('C:/Users/Lenovo/Desktop/car.mp4') #加载视频
# cap =cv2.VideoCapture(0) #打开摄像头

#循环读取视频帧
while True:
    ret,frame =cap.read()
    if ret ==True:
        cv2.namedWindow('video', cv2.WINDOW_NORMAL)
        cv2.resizeWindow('video', 1280, 640)
        cv2.imshow('video',frame)

    key =cv2.waitKey(10)
    #用户按esc退出
    if key ==27:
        break

#最后释放资源
cap.release()
cv2.destroyAllWindows()

65-2:去除背景示例
# 去除背景
import  cv2
import numpy as np
cap =cv2.VideoCapture(0) #打开摄像头
# 创建mog对象
mog =cv2.createBackgroundSubtractorMOG2()#静置的为背景

#循环读取视频帧
while True:
    ret,frame =cap.read()
    if ret ==True:
        fgmask =mog.apply(frame)#在每帧图像中施加去背景算法

        cv2.namedWindow('fgmask', cv2.WINDOW_NORMAL)
        cv2.resizeWindow('fgmask', 1280, 640)
        cv2.imshow('fgmask',fgmask)

    key =cv2.waitKey(1)
    #用户按esc退出
    if key ==27:
        break

#最后释放资源
cap.release()
cv2.destroyAllWindows()


65-3:车辆识别并计数代码

# 形态学识别车辆(真正达到高精度还需要深度学习检测,然后加上本节的计数方法才可以)
import  cv2
import numpy as np

cap =cv2.VideoCapture('C:/Users/Lenovo/Desktop/car.mp4') #加载视频
# 创建mog对象
mog =cv2.createBackgroundSubtractorMOG2()#静置的为背景
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))
min_w =100
min_h =90
line_high =600
offset =7
cars = []
carnum = 0

# 计算外接矩形中线点函数
def center(x,y,w,h):
    x1 = int(w/2)
    y1 = int(h/2)
    cx = int(x) + x1
    cy = int(y) + y1
    return cx, cy

#循环读取视频帧
while True:
    ret,frame =cap.read()
    if ret ==True:
        # 先灰度化处理,然后高斯去噪
        gray =cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY) #灰度化
        blur =cv2.GaussianBlur(gray,(3,3),5) #高斯去噪
        fgmask =mog.apply(blur)#去背景
        erode =cv2.erode(fgmask,kernel,iterations=1) #腐蚀,让噪声点减小
        dialte = cv2.dilate(erode,kernel,iterations=2) #膨胀,让目标区域加深
        close =cv2.morphologyEx(dialte,cv2.MORPH_CLOSE,kernel)#闭运算去除内部噪声
        contours, _ =cv2.findContours(close,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) #寻找轮廓
        # 划线,即表示车辆通过这个线时开始计数。
        cv2.line(frame,(10,line_high),(1280,line_high),(255,255,0),3)

        # 画出所有检测出来的轮廓
        for contour in contours:
            # 最大外接矩形
            (x,y,w,h) = cv2.boundingRect(contour)#根据轮廓获取矩形框的坐标信息
            # 通过外接矩形的宽高来过滤掉小矩形框
            is_valid =(w>=min_w) and (h>=min_h)
            if not is_valid:
                continue
            # 通过这个is_valid判断语句,表明是正常车辆
            cv2.rectangle(frame,(x,y),(x+w,y+h),(0,0,255),2)#绘制矩形框
            # 把车抽象为一点,即外接矩形的中心点
            cpoint = center(x,y,w,h)
            cars.append(cpoint)
            cv2.circle(frame,(cpoint),5,(0,0,255),-1) #绘制把车抽象为一点

            #判断汽车是否过检测线
            for (x,y) in cars:
                if y > (line_high - offset) and y < (line_high +offset):
                    #落入了有效区间,计数加1
                    carnum += 1
                    cars.remove((x,y))
                    # print(carnum)


        cv2.putText(frame,'Cars Counts:'+str(carnum),(500,60),cv2.FONT_HERSHEY_SIMPLEX,2,(255,0,255),5) #将计数写入每帧图像中
        cv2.namedWindow('fgmask', cv2.WINDOW_NORMAL)
        cv2.resizeWindow('fgmask', 1280, 720)
        cv2.imshow('fgmask',frame)

    key =cv2.waitKey(50)
    #用户按esc退出
    if key ==27:
        break

#最后释放资源
cap.release()
cv2.destroyAllWindows()

代码66:

# Harris角点检测
import  cv2
import numpy as np
dst_thresd =0.01
img =cv2.imread('C:/Users/Lenovo/Desktop/jiaodian.png') #加载视频
# 变成灰度图片
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#Harris角点检测,blochSize类似于卷积核,可以是偶数,返回角点反应
dst = cv2.cornerHarris(gray,blockSize =2,ksize =3, k =0.04)
# print(gray.shape)
# print(dst)
# print(dst.shape)
# print(type(dst))
# 设置阈值,然后显示角点
img[dst > (dst_thresd * dst.max())] = [0,0,255]
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

代码67:SIFT关键点检测

# SIFT关键点检测算法:包含中心点和角点
import  cv2
import numpy as np

img =cv2.imread('C:/Users/Lenovo/Desktop/jiaodian.png') #加载视频
# 变成灰度图片
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

#创建SIFT对象
sift =cv2.SIFT_create()
#进行检测
kp =sift.detect(gray)
# print(kp) #kp是一个列表,里面存放的是封装的KeyPoint对象
#绘制关键点,对gray开始绘制,使用kp关键点,显示在img
cv2.drawKeypoints(gray,kp,img)

cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

代码68:SIFT关键点描述子

# SIFT关键点描述子(128维,16x16维),作用可以做图像与图像之间的特征匹配。
import  cv2
import numpy as np

img =cv2.imread('C:/Users/Lenovo/Desktop/jiaodian.png') #加载视频
# 变成灰度图片
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

#创建SIFT对象
sift =cv2.SIFT_create()
#进行检测
kp =sift.detect(gray)
# print(kp) #kp是一个列表,里面存放的是封装的KeyPoint对象

#计算描述子
kp,descript = sift.compute(gray,kp)
print(len(kp))
print(type(descript))
print(descript.shape)
print(descript[0])

# 一步到位计算
kp,descript = sift.detectAndCompute(gray,None)

#绘制关键点,对gray开始绘制,使用kp关键点,显示在img
cv2.drawKeypoints(gray,kp,img)

cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()


代码69:Shi-Tomasi角点检测(是Harris角点检测的改进算法)

# Shi-Tomasi角点检测
import  cv2
import numpy as np

img =cv2.imread('C:/Users/Lenovo/Desktop/jiaodian.png') #加载视频
# 变成灰度图片
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

# Shi-Tomasi角点检测
corners =cv2.goodFeaturesToTrack(gray,maxCorners=0, qualityLevel=0.01, minDistance=10)
# print(corners)
# print(type(corners))
corners =np.int0(corners) #转换为int型

#画出角点
for i in corners:
    #i相当于corners中的每一行数据,ravel()把二维变一维了。即角点的坐标点
    x,y = i.ravel()
    cv2.circle(img,(x,y),3,(0,0,255),-1)

cv2.imshow('Shi-Tomasi',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值