OpenCV系列学习之(二)

简介: OpenCV系列学习之(二)

一、图像梯度计算

1)sobel算子(作用是标注轮廓区域)形式一般是这样

c94f46efbf10dd747982056a393150b4.jpg

Gx即卷积完之后是右边像素-左边像素,Gy是上边像素-下边像素

6663797d7e224e94cae4954b5ddb28ca.jpg

dx=1,dy=0时,表示对其进行Gx计算。反之亦然。

白到黑是正数,黑到白是负数,所有的负数会被截断成0(黑色)。所以得取绝对值。使用cv2.CV_64F的原因是从白到黑的边界点导数为负数后,如果使用的是np.int8则会变成0。

f7225839953a6b21aab296488b9c2cfe.jpg

def cv_show(img,name):
      cv2.imshow(name,img)
      cv2.waitKey(0)
      cv2.destroyAllWindows()
sobelx=cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
sobelx=cv2.convertScaleAbs(sobelx)   #取绝对值
sobely=cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
sobely=cv2.convertScaleAbs(sobely)
cv_show(sobelx,'sobelx')
cv_show(sobely,'sobely')
sobelxy=cv2.addWeighted(sobelx,0.5,sobely,0.5,0)  #0为偏置量
cv_show(sobelxy,'sobelxy')

不建议x,y直接计算,而是分别计算x、y再相加。

2)scharr算子、laplacian算子

2be814fd6b8c6b87051e48f10b1e3037.jpg

拉普拉是算子即中间点与周围点的比较,没有x,y做这些了。代码基本差不多,如下:

import cv2
import numpy as np
img=cv2.imread('lena.jpg',cv2.IMREAD_GRAYSCALE)
def cv_show(img,name):
      cv2.imshow(name,img)
      cv2.waitKey(0)
      cv2.destroyAllWindows()
#sobel算子
sobelx=cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
sobelx=cv2.convertScaleAbs(sobelx)
sobely=cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
sobely=cv2.convertScaleAbs(sobely)
sobelxy=cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
#scharrt算子
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)
#拉普拉斯算子
laplacian=cv2.Laplacian(img,cv2.CV_64F)
laplacian=cv2.convertScaleAbs(laplacian)
res=np.hstack((sobelxy,scharry,laplacian))
cv_show(res,'res')

二、边缘检测(一般直接转换为灰度图就可以了)

1)canny边缘检测算法

139fdb44984ef0bbc8553dca9682fad0.jpg

2、非极大值抑制法

3c2fe5401776f6e087175639b6a6c727.jpg

3、双阈值检测

1f96704797ce9da851dce2e8d2075b0d.jpg

算法实现

import cv2
img=cv2.imread('car.png',cv2.IMREAD_GRAYSCALE)
v1=cv2.Canny(img,80,120)
cv2.imshow('img',v1)
cv2.waitKey(0)
cv2.destroyAllWindows()

三、图像金字塔(让数据更丰富一些)与轮廓检测

20b821a82d46b6e9a2550e201482cdd4.jpg

7ea6894f1c63ee871bdafac4e70586db.jpg

a555d5985890a2138d88a1433e90910a.jpg

上采样可以放大图片,下采样可以缩小图片。实现代码如下:

up=cv2.pyrUp(img) #pyr表示金字塔,up表示放大
down=cv2.pyrDown(img)  #down表示缩小

拉普拉斯金字塔

ba02d3a8d4d7e3cd9f132771b446b9cf.jpg

1)图像轮廓

需要注意的是cv2.findContours()函数接受的参数为二值图,即黑白的(不是灰度图),所以读取的图像要先转成灰度的,再转成二值图。需要注意的是,cv2.findCountours()返回两个参数,cv3则返回三个参数。

83e6f80cb09b646ed9339794f94b6b39.jpg

为了更高的准确率,图像需要二值化,实现代码如下:

img=cv2.imread('car.png')
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) # 转换为灰度图
ret,thresh=cv2.threshold(gray,127,255,cv2.THRESH_BINARY)  #图像二值化
def cv_show(img,name):
      cv2.imshow(name,img)
      cv2.waitKey()
      cv2.destroyAllWindows()
cv_show(thresh,'up')

2)绘制轮廓

76b9e466535438e2a104eb239623934d.jpg

contours,hierarchy=cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)  #contours为图像轮廓信息,hierarcgy为图像层数
draw_img=img.copy()
res=cv2.drawContours(img,contours,-1,(0,0,255),2)  #-1一般基本不变,指全部轮廓,括号即为(BGR)三个通道的值
cv_show(res,'res')

3)轮廓近似

dfd62f362cc709c999700f6a733b6245.jpg

4)模板匹配

模板匹配跟卷积很像,模板在原图像上从原点开始滑动,计算模板与(图像被模板覆盖的地方)的差别程度,这个差别程度在opencv的计算方法里面有6种,然后将每一个结果放入一个矩阵里作为结果输出。加入原图是AXB输出,模板是aXb输出,则输出的结果矩阵为(A-a+1)X(B-b+1).

23dc6707675819787c291eced9809613.jpg

算法实现

import cv2   #opencv读取图像bgr格式
import numpy as np
# 模版匹配
def template_image():
      target = cv2.imread("lena.jpg")
      tpl = cv2.imread("ln.png")
      cv2.imshow("模板", tpl)
      cv2.imshow("原图", target)
      methods = [cv2.TM_SQDIFF_NORMED, cv2.TM_CCORR_NORMED, cv2.TM_CCOEFF_NORMED]  #各种匹配算法
      th, tw = tpl.shape[:2]   #获取模板图像的高宽
      for md in methods:
            print(md)
            result = cv2.matchTemplate(target, tpl, md)
            min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
            if md == cv2.TM_SQDIFF_NORMED:
                  tl = min_loc
            else:
                  tl = max_loc
            br = (tl[0] + tw, tl[1] + th)
            cv2.rectangle(target, tl, br, (0, 0, 255), 2)
            cv2.imshow("匹配" + np.str(md), target)
template_image()
cv2.waitKey(0)
cv2.destroyAllWindows()
相关文章
|
8月前
|
机器学习/深度学习 存储 数据库
Python3 OpenCV4 计算机视觉学习手册:6~11(5)
Python3 OpenCV4 计算机视觉学习手册:6~11(5)
97 0
|
8月前
|
存储 资源调度 算法
Opencv(C++)系列学习---SIFT、SURF、ORB算子特征检测
Opencv(C++)系列学习---SIFT、SURF、ORB算子特征检测
439 0
|
8月前
|
机器学习/深度学习 算法 数据可视化
计算机视觉+深度学习+机器学习+opencv+目标检测跟踪+一站式学习(代码+视频+PPT)-2
计算机视觉+深度学习+机器学习+opencv+目标检测跟踪+一站式学习(代码+视频+PPT)
|
8月前
|
机器学习/深度学习 Ubuntu Linux
计算机视觉+深度学习+机器学习+opencv+目标检测跟踪+一站式学习(代码+视频+PPT)-1
计算机视觉+深度学习+机器学习+opencv+目标检测跟踪+一站式学习(代码+视频+PPT)
|
7月前
|
机器学习/深度学习 人工智能 自然语言处理
OpenCV与AI深度学习之常用AI名词解释学习
AGI:Artificial General Intelligence (通用人工智能):是指具备与人类同等或超越人类的智能,能够表现出正常人类所具有的所有智能行为。又被称为强人工智能。
142 2
|
6月前
|
计算机视觉 Python
opencv 处理图像去噪的几种方法学习
OpenCV 提供了多种图像去噪的方法,以下是一些常见的去噪技术以及相应的 Python 代码示例: 均值滤波:使用像素邻域的灰度均值代替该像素的值。
80 0
|
7月前
|
机器学习/深度学习 开发框架 TensorFlow
### 如何系统化学习OpenCV4
### 如何系统化学习OpenCV4
47 0
|
8月前
|
算法 计算机视觉 Python
【OpenCV】-算子(Sobel、Canny、Laplacian)学习
【OpenCV】-算子(Sobel、Canny、Laplacian)学习
269 2
|
8月前
|
存储 计算机视觉
OpenCV—学习基本绘图
OpenCV—学习基本绘图
|
8月前
|
算法 C++ 计算机视觉
Opencv(C++)学习系列---Laplacian拉普拉斯边缘检测算法
Opencv(C++)学习系列---Laplacian拉普拉斯边缘检测算法
364 0