python-opencv快速上手教程

Posted 帅气的黑桃J

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python-opencv快速上手教程相关的知识,希望对你有一定的参考价值。

简介

因为近期的一些需求,需要一些图像处理算法来构建一些需要的内容,故整理了一下python-opencv的资料,这里面有一部分内容是笔者自己构建出来的,也有相当一部分内容是借鉴前人所留下的经验,因此,本文集前人之精髓,加之本人的整理,希望对大家有帮助。

开发环境

需要导入cv2,numpy,matplotlib三个库

pip install cv2//如果无法安装成功可以尝试一下pip install python-opencv
pip install numpy
pip install matplotlib

快速上手

读取图像

import cv2

image = cv2.imread('temp.png')

显示图像

import cv2

if __name__ == '__main__':
    image = cv2.imread('temp.png')
	# imshow显示图像
    # 其中"image"为标题,image为需要显示的图像
    cv2.imshow("image", image)
    # 等待销毁
    cv2.waitKey(0)
    cv2.destroyAllWindows()

常用的图像处理方法

二值化

图像二值化即是设置一个阈值T,如果图像像素点的灰度值小于T此点值设为0(黑),反之设为255(白),最后图像只有黑和白两种颜色,如下图所示。

opencv中的二值化-函数有两种,阈值化的图像二值化,自适应阈值化的二值化。

优质博客解析二值化

固定阈值

代码实现

import cv2 as cv

# 读入灰度图像
img = cv.imread('baby_g.jpg', 0)

# 以127为阈值进行二值化分割图像,这个值可以自己调整
ret, th = cv.threshold(img, 127, 255, cv.THRESH_BINARY)
cv.imshow('thresh', th)
cv.waitKey(0)
cv.destroyAllWindows()

函数讲解

**cv.threshold()**用来实现阈值分割,ret是return value缩写,代表当前的阈值,暂时不用理会。函数有4个参数:
参数1:要处理的原图,一般是灰度图
参数2:设定的阈值
参数3:最大阈值,一般为255
参数4:阈值的方式,主要有5种。

cv.threshold() 参数4阈值方式详解

import cv2 as cv 
import matplotlib.pyplot as plt

img = cv.imread('gradient.jpg',0)

# 应用5种不同的阈值方法
ret, th1 = cv.threshold(img, 127, 255, cv.THRESH_BINARY)
ret, th2 = cv.threshold(img, 127, 255, cv.THRESH_BINARY_INV)
ret, th3 = cv.threshold(img, 127, 255, cv.THRESH_TRUNC)
ret, th4 = cv.threshold(img, 127, 255, cv.THRESH_TOZERO)
ret, th5 = cv.threshold(img, 127, 255, cv.THRESH_TOZERO_INV)

titles = ['Original', 'BINARY', 'BINARY_INV', 'TRUNC', 'TOZERO', 'TOZERO_INV']
images = [img, th1, th2, th3, th4, th5]

# 使用Matplotlib显示
for i in range(6):
    plt.subplot(2, 3, i + 1)
    plt.imshow(images[i], 'gray')
    plt.title(titles[i], fontsize=8)
    plt.xticks([]), plt.yticks([])  # 隐藏坐标轴

plt.show()

高通滤波器

高通滤波器(HPF)是检测图像的某个区域,根据该像素与周围像素的亮度差值来提升该像素的亮度的滤波器。

代码实现

import cv2
import numpy as np
from scipy import ndimage

if __name__ == '__main__':
    kernel_3x3 = np.array([
        [-1, -1, -1],
        [-1, 8, -1],
        [-1, -1, -1],
    ])

    kernel_5x5 = np.array([
        [-1, -1, -1, -1, -1],
        [-1, -1, 2, -1, -1],
        [-1, 2, 4, 2, -1],
        [-1, -1, 2, -1, -1],
        [-1, -1, -1, -1, -1],
    ])

    img = cv2.imread('temp3.png',flags=cv2.IMREAD_GRAYSCALE)
    k3 = ndimage.convolve(img, kernel_3x3)
    k5 = ndimage.convolve(img, kernel_5x5)

    GBlur = cv2.GaussianBlur(img, (11, 11), 0)
    g_hpf = img - GBlur

    cv2.imshow('img', img)
    cv2.imshow('3x3', k3)
    cv2.imshow('5x5', k5)
    cv2.imshow('g_hpf', g_hpf)
    cv2.waitKey()
    cv2.destroyAllWindows()

代码优化

import cv2

if __name__ == '__main__':

    img = cv2.imread('temp3.png',flags=cv2.IMREAD_GRAYSCALE)

    GBlur = cv2.GaussianBlur(img, (11, 11), 0)
    g_hpf = img - GBlur

    cv2.imshow('g_hpf', g_hpf)
    cv2.waitKey()
    cv2.destroyAllWindows()

低通滤波器

低通滤波器则在像素与周围像素的亮度差值小于一个特定值时,平滑该像素的亮度,主要用于去噪和模糊化。

形态学操作

膨胀和腐蚀被称为形态学操作,它们通常在二进制图像上执行,类似于轮廓检测。通过将像素添加到该图像中的对象的感知边界,扩张放大图像中的明亮白色区域。侵蚀恰恰相反:它沿着物体边界移除像素并缩小物体的大小。

膨胀

要在OpenCV中扩展图像,您可以使用该dilate函数和三个输入:原始二进制图像,确定扩张大小的内核(无将导致默认大小),以及执行扩张的多次迭代(通常= 1)

在下面的例子中,我们有一个5x5的内核,它们在图像上移动,就像一个滤波器一样,如果任何周围的像素在5x5窗口中都是白色,则将像素变成白色!我们将使用草书字母“j”的简单图像作为示例。

腐蚀

为了侵蚀图像,我们采用erode函数

# Reads in a binary image
image = cv2.imread(‘j.png’, 0) 

# Create a 5x5 kernel of ones
kernel = np.ones((5,5),np.uint8)

# Dilate the image
dilation = cv2.dilate(image, kernel, iterations = 1)
# Erode the image
erosion = cv2.erode(image, kernel, iterations = 1)	

OPENING

如上所述,这些操作通常组合在一起以获得理想的结果!一种这样的组合称为Opening,先是侵蚀,然后是膨胀这在降噪中是有用的,其中侵蚀首先消除噪声(并收缩物体)然后扩张再次扩大物体,但噪声将从先前的侵蚀中消失。为了在OpenCV中实现这一点,我们将函数morphologyEx与原始图像,我们想要执行的操作以及传入的内核一起使用。

相关实现

opening = cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel)

Closing

Closing 是Opening的反向组合,它先是膨胀,然后是侵蚀。这对于关闭物体内的小孔或暗区很有用
它可用于关闭前景对象内的小孔或对象上的小黑点。

相关实现

closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

Blob分析

Blob分析:(Blob Analysis)是对图像中相同像素的连通域进行分析,该连通域称为Blob。经二值化(Binary Thresholding)处理后的图像中色斑可认为是blob。Blob分析工具可以从背景中分离出目标,并可以计算出目标的数量、位置、形状、方向和大小,还可以提供相关斑点间的拓扑结构。在处理过程中不是对单个像素逐一分析,而是对图像的行进行操作。图像的每一行都用游程长度编码(RLE)来表示相邻的目标范围。这种算法与基于像素的算法相比,大大提高了处理的速度。

也可以称Blob(斑点)是指二维图像中和周围像素点存在颜色差异和灰度差异的特征区域,针对这些特征区域所提取出某些具有区域代表性的信息,就被称为Blob特征。由于Blob特征代表的是一个区域,所以相比单纯的角点,它的稳定性要更好,抗噪声能力也更强,所以它在图像配准上扮演了很重要的角色。例如在opencv::ccalib模块中,进行双目相机的三维重建时需要先利用两张分别由不同相机拍摄出的图像来进行立体匹配从而得到深度图,而深度图表现出来就是具有多个Blob的灰度图像,而进行立体匹配过程也会在两张图像之间寻找相似的区域特征。

同时有时图像中的Blob也是我们关心的区域,比如在医学与生物领域,我们需要从一些X光照片或细胞显微照片中提取一些具有特殊意义的斑点的位置或数量。

Blob特征分析算法使用相对简单的方式来检测斑点类的特征,OpenCV提供了一种方便的APISimpleBlobDetector来检测斑点并根据不同的特征对其进行过滤。

简单来说就是可以判断图像里具有某一个特征的目标,如下图所示

首先,需要先告诉SimpleBlobDetector需要检测什么类型的目标,这个时候就需要我们输入一些特定的参数来确定它。

代码实现

# Standard imports
import cv2
import numpy as np;
# Read image
im = cv2.imread("blob.jpg", cv2.IMREAD_GRAYSCALE)
# Set up the detector with default parameters.
detector = cv2.SimpleBlobDetector()
# Detect blobs.
keypoints = detector.detect(im)
# Draw detected blobs as red circles.
# cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS ensures the size of the circle corresponds to the size of blob
im_with_keypoints = cv2.drawKeypoints(im, keypoints, np.array([]), (0,0,255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
# Show keypoints
cv2.imshow("Keypoints", im_with_keypoints)
cv2.waitKey(0)
cv2.destroyAllWindows()

参考资料

CV2模块使用(详细教程)

Opencv3入门教程(一)基础知识

opencv 二值化图像详解 一文看懂各种二值化方法

形态学操作—膨胀与腐蚀

OpenCV中blob的概念以及OpenCV中BLOB特征提取与几何形状分类

OpenCV4学习笔记(49)——Blob特征分析算法

以上是关于python-opencv快速上手教程的主要内容,如果未能解决你的问题,请参考以下文章

(转)Jmock快速上手教程

快速上手React:

快速上手笔记,PyTorch模型训练实用教程(附代码)

python快速上手教程

Python爬虫快速上手教程

Weex 快速上手教程