OpenCV图像识别实战 第二节 opencv-python基本编程(2)

接着前面那篇文章,继续讲解opencv-python的基本编程操作

目录

1.图像阈值的处理

2.图像平滑处理

3.图像形态学操作

 4.梯度计算

5.canny边缘检测算法

 6.图像轮廓检测方法

7.模板匹配

8.金字塔的制作方法

1.图像阈值的处理

格式 ret,dst = cv2.threshold(src,thresh,maxval,type) 

括号中src为输入图像,只能是灰度图:dst为输出图;thresh为阈值;maxval为当像素超过阈值(或者小于阈值,由type决定),所赋予的值;

import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取下我的图片(eye)
img = cv2.imread("eye.png")
cv2.imshow('img',img)
cv2.waitKey(1000)
#阈值处理
ret, thresh1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)  #超过阈值部分取最大值,否则取o
ret, thresh2 = cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV)  #上面的反转(INV)表示反转
ret, thresh3 = cv2.threshold(img,127,255,cv2.THRESH_TRUNC)  #大于阈值部分设为阈值,否则不变
ret, thresh4 = cv2.threshold(img,127,255,cv2.THRESH_TOZERO)  #大于阈值部分不改变,否则为0
ret, thresh5 = cv2.threshold(img,127,255,cv2.THRESH_TOZERO_INV)  #上面的反转
#展示结果
cv2.imshow('1',thresh1)
cv2.waitKey(1000)
cv2.imshow('2',thresh2)
cv2.waitKey(1000)
cv2.imshow('3',thresh3)
cv2.waitKey(1000)
cv2.imshow('5',thresh4)
cv2.waitKey(1000)
cv2.imshow('5',thresh5)
cv2.waitKey(1000)

结果

2.图像平滑处理

 

#图像平滑处理
# 1.均值滤波
blur = cv2.blur(img, (3,3))  #(3,3)表示选取像素点周围3x3范围的矩阵处理,一般为奇数

# 2.方框滤波 (基本和均值一样,可以选择归一化)
box = cv2.boxFilter(img,-1,(3,3),normalize=True)   # -1 表示一致性 ,若 normalize=False 则不符合的像素值会为255

# 3.高斯滤波
aussian = cv2.GaussianBlur(img,(5,5),1)

#4.中值滤波
median = cv2.medianBlur(img, 5)

#展示全部图像
res = np.hstack((blur,aussian,median))
cv2.imshow('median vs average', res)
cv2.waitKey(0)
cv2.destroyWindow()
3.图像形态学操作

腐蚀操作及膨胀操作

# 图像形态学操作
import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread("pic1.png")
cv2.imshow('img',img)
cv2.waitKey(1000)
img2 = cv2.imread("pic2.png")
cv2.imshow('img2',img2)
cv2.waitKey(1000)

# 腐蚀操作
#kernel = np.ones((3,3),np.uint8) #设定kernel为一个核
#erosion = cv2.erode(img,kernel,iterations=2)

#cv2.imshow('erosion', erosion)
#cv2.waitKey(1000)

#观察腐蚀结果
#erosion1 = cv2.erode(img,kernel,iterations=1)
#erosion2 = cv2.erode(img,kernel,iterations=2)
#erosion3 = cv2.erode(img,kernel,iterations=3)
#res = np.hstack((erosion1,erosion2,erosion3))
#cv2.imshow('res',res)
#cv2.waitKey(1000)
#cv2.destroyAllWindows()

#膨胀操作
#pic_erosion = cv2.erode(img,kernel,iterations=1)

#cv2.imshow('erosion',erosion)
#cv2.waitKey(1000)
#cv2.destroyAllWindows()

#kernel = np.ones((3,3),np.uint8) #设定kernel为一个核
#dilate_1 = cv2.dilate(img2,kernel,iterations=1)
#dilate_2 = cv2.dilate(img2,kernel,iterations=2)
#dilate_3 = cv2.dilate(img2,kernel,iterations=3)
#res = np.hstack((dilate_1,dilate_2,dilate_3))
#cv2.imshow('res',res)
#cv2.waitKey(2000)
#cv2.destroyAllWindows()

开运算及闭运算

#开运算和闭运算
#开运算:先腐蚀,再膨胀
kernel = np.ones((5,5),np.uint8) #设定kernel为一个核
opening = cv2.morphologyEx(img,cv2.MORPH_OPEN,Kernel)

cv2.imshow('opening',opening)
cv2.waitKey(2000)
cv2.destroyAllWindows()

#闭运算:先膨胀,再腐蚀
kernel = np.ones((30,30),np.uint8) #设定kernel为一个核
closing = cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)

cv2.imshow('closing',closing)
cv2.waitKey(2000)
cv2.destroyAllWindows()

梯度计算

#梯度计算
#梯度=膨胀-腐蚀

#第一步:进行膨胀和腐蚀
kernel = np.ones((10,10),np.uint8)
dilate = cv2.dilate(img2,kernel,iterations=5) #进行5次
erosion = cv2.erode(img2,kernel,iterations=5)

# 观察图像
res = np.hstack((dilate,erosion))
cv2.imshow('res',res)
cv2.waitKey(2000)
cv2.destroyAllWindows()

#得到的边界信息(梯度运算)
grandient = cv2.morphologyEx(img2,cv2.MORPH_GRADIENT,kernel)
cv2.imshow('gradient',grandient)
cv2.waitKey(2000)
cv2.destroyAllWindows()

礼帽和黑帽

#礼帽和黑帽
#礼帽 = 原始输入-开运算结果
kernel = np.ones((10,10),np.uint8)
tophat = cv2.morphologyEx(img2,cv2.MORPH_TOPHAT,kernel)
cv2.imshow('tophat',tophat)
cv2.waitKey(2000)
cv2.destroyAllWindows()

#黑帽 = 闭运算-原始输入
blackhat = cv2.morphologyEx(img2,cv2.MORPH_BLACKHAT,kernel)
cv2.imshow('blackhat',blackhat)
cv2.waitKey(2000)
cv2.destroyAllWindows()

 4.梯度计算

sobel算子

 

 代码实现

import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread('pic2.png',cv2.IMREAD_GRAYSCALE)
cv2.imshow("img",img)
cv2.waitKey(2000)
cv2.destroyAllWindows()

##sobel算子
def cv_show(img,name):
    cv2.imshow(name,img)
    cv2.waitKey(2000)
    cv2.destroyAllWindows()
#x方向
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3) #括号中依次为(输入图像,深度,x方向,y方向,核矩阵大小)(cv2.CV_64F写成负数形式)
cv_show(sobelx,'sobelx')
sobelx = cv2.convertScaleAbs(sobelx)  #所有的负数会被截断为0,所以要取绝对值
cv_show(sobelx,'sobelx')

#y方向 同理
sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
sobely = cv2.convertScaleAbs(sobely)
cv_show(sobely,'sobely')

#分别计算x和y,再求和
sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
cv_show(sobelxy,'sobelxy')
#不建议直接计算

 

scharr算子及laplacian算子(拉普拉斯算子)

 

 代码实现

##scharr算子 与sobel算子用法一样
scharrx = cv2.Scharr(img,cv2.CV_64F,1,0)
scharry = cv2.Scharr(img,cv2.CV_64F,0,1)
scharrx = cv2.convertScaleAbs(scharrx)
scharry = cv2.convertScaleAbs(scharry)
scharrxy = cv2.addWeighted(scharrx,0.5,scharry,0.5,0)
cv_show(scharrxy,'scharrxy')

##laplacian算子 拉普拉斯算子
laplacian = cv2.Laplacian(img,cv2.CV_64F)
laplacian = cv2.convertScaleAbs(laplacian)
cv_show(laplacian,'laplacian')

 5.canny边缘检测算法

 

 

 

 

 

 

代码实现

#canny边缘检测算法
#边界与梯度是垂直的
import cv2
import numpy as np
import matplotlib.pyplot as plt

#定义一下cv_show,方便后面代码编写
def cv_show(img,name):
    cv2.imshow(name,img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

#转化为灰度图
img = cv2.imread('girl1.jpg',cv2.IMREAD_GRAYSCALE)
cv2.waitKey(2000)
cv2.destroyAllWindows()

#canny的参数对检测的影响
V1=cv2.Canny(img,80,150)
V2=cv2.Canny(img,50,100)
res = np.hstack((V1,V2))
cv_show(res,'res')

#范围越小,检测的越细

 结果展示:

 6.图像轮廓检测方法

检测得使用二值图像,先处理成灰度图,再进行阈值处理,最后再用检测函数

 

 

import cv2
import numpy as np
import matplotlib.pyplot as plt

def cv_show(img,name):
    cv2.imshow(name,img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

#轮廓检测方法
#检测得使用二值图像,先处理成灰度图,再进行阈值处理,最后再用检测函数

img = cv2.imread('girl1.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)   #转灰度图
ret, thresh = cv2.threshold(gray,127,255,cv2.THRESH_BINARY) #阈值(二值)
cv_show(thresh,'thresh')
binary,contours,hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE) 
#上面的cv2.RETR_TREE可以换成图片中其他检测方法,具体区别看图
#binary(二值的结果):contours(轮廓的信息);hierarchy(层级)

#绘制轮廓
#注意要copy,不然原图会发生改变
draw_img = img.copy()
res = cv2.drawContours(draw_img,contours,-1,(0,0,255),2) 
#draw_img(原图像),contours(轮廓),-1(表示全部轮廓),(0,0,255)为BGR,拿什么颜色去画,2为线条宽度
cv_show(res,'res')

运行结果(用的是红色描轮廓)

 7.模板匹配

单对象代码实现

import cv2
import numpy as np
import matplotlib.pyplot as plt

def cv_show(img,name):
    cv2.imshow(name,img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

#模板匹配(单个对象)
img = cv2.imread('girl1.jpg',0)
img2 = img.copy()
template = cv2.imread('black.jpg',0)

#查看原图和匹配图的shape
#print(img.shape)
#print(template.shape)

#模板在原图像上开始滑动,计算模板与(图像被模板覆盖的地方)差别程度。
#这个差别程度的计算方法在opencv里有6种,之后将每次计算的结果放入一个矩阵里,作为结果输出。
#假设原图是AxB大小,而模板是axb大小,则输出结果的矩阵是(A-a+1)x(B-b+1)
#res = cv2.matchTemplate(img,template,1)
#print(res.shape)

#可以得出巨多结果,opencv会自动计算,如下
min_val,max_val,min_loc,max_loc = cv2.minMaxLoc(res)

#print(min_val,max_val,min_loc,max_loc)
#得出最小值及最大值及各自位置,一共4个参数
#最小值位置就是样本在图像中左上角的位置

w, h = template.shape[::-1]
# 有下面6种匹配方法,具体区别看下图
methods = ['cv2.TM_CCOEFF', 'cv2.TM_CCOEFF_NORMED', 'cv2.TM_CCORR',
            'cv2.TM_CCORR_NORMED', 'cv2.TM_SQDIFF', 'cv2.TM_SQDIFF_NORMED']
#匹配方法的真值
for meth in methods:
    img = img2.copy()
    method = eval(meth)   #eval 语句用来计算存储在字符串中的有效 Python 表达式
    #模板匹配
    res = cv2.matchTemplate(img,template,method)
    # 寻找最值
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
    # 使用不同的比较方法,对结果的解释不同
    #如果是平方差匹配TM_SQDIFF或归一化平方差匹配TM_SQDIFF_NORMED,取最小值
    if method in [cv2.TM_SQDIFF,cv2.TM_SQDIFF_NORMED]:
        top_left = min_loc
    else:
        top_left = max_loc
    bottom_right = (top_left[0] + w, top_left[1] + h)
    cv2.rectangle(img, top_left, bottom_right, 255, 2)
    plt.subplot(121), plt.imshow(res, cmap='gray')
    plt.xticks([]), plt.yticks([]) #隐藏坐标
    plt.subplot(122), plt.imshow(img, cmap='gray')
    plt.xticks([]), plt.yticks([])
    plt.suptitle(meth)
    plt.show()

 

效果图 

 

 多对象代码实现

#模板匹配(多个对象)
img_rgb = cv2.imread('coins.png')
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
template = cv2.imread('coin.png',0)
w, h = template.shape[::-1]
res = cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED)
threshold = 0.4
loc = np.where( res >= threshold)
for pt in zip(*loc[::-1]):
    cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0,0,255), 1)
cv2.imshow("img",img_rgb)
cv2.waitKey(0)
cv2.destroyAllWindows()

8.金字塔的制作方法

高斯金字塔

 

 

 代码实现

#金字塔的制作方法
img = cv2.imread("girl1.jpg")
cv_show(img,'img')
cv2.waitKey(0)
cv2.destroyAllWindows()
print(img.shape)

#up
up = cv2.pyrUp(img)
cv_show(up,'up')
print (up.shape)
cv2.waitKey(0)
cv2.destroyAllWindows()

#down
down = cv2.pyrDown(img)
cv_show(down,'down')
print(down.shape)
cv2.waitKey(0)
cv2.destroyAllWindows()

#先up再down
up = cv2.pyrUp(img)
up_down = cv2.pyrDown(up)
print (up_down.shape)
cv2.waitKey(0)
cv2.destroyAllWindows()

 拉普拉斯金字塔

#拉普拉斯变换的图像
down = cv2.pyrDown(img)
down_up = cv2.pyrUp(down)
l_l = img-down_up
cv_show(l_l,'l_l')
down = cv2.pyrDown(l_l)
cv_show(down,'down')

效果

 第二节到此结束,不是很难,自己写一下代码,跑一跑就能理解个7788了。

后面会附上代码包。 

(82条消息) opencv-python学习代码-Python文档类资源-CSDN文库

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenCV图像识别项目实战中有几个常见的应用。首先是图像增强,利用OpenCV可以消除运动引起的图像模糊、去除阴影等影响,以提升图像质量和清晰度。 其次是基于OpenCV的实际项目,例如车道线检测和路面的坑洼检测等。通过OpenCV的图像处理和计算机视觉算法,可以实现对特定对象的检测,进而用于道路规划、驾驶辅助等应用场景。 此外,OpenCV还可以与深度学习等其他技术相结合,用于解决难度较大的问题,如图像分割、人脸检测、人脸跟踪、运动检测等。深度学习模型可以在OpenCV的基础上进行训练和应用,进一步提升图像识别的准确性和效率。 需要注意的是,在实施OpenCV图像识别项目时,通常需要使用特定的编程环境。例如,使用Python 3.6.3作为编程语言,并安装OpenCV-Python 3.4.1.15版本作为图像处理库。这些环境配置的准备工作是开展OpenCV图像识别项目的前提。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [推荐几个Python+OpenCV实战项目](https://blog.csdn.net/amusi1994/article/details/126314121)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [OpenCV图像识别实战 第二节 opencv-python基本编程(1)](https://blog.csdn.net/prophet_xh/article/details/124769813)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值