Python 物联网入门指南(二)(3)https://developer.aliyun.com/article/1507160
图像分割
分割是将图像分成不同区域的过程。轮廓是对象边界周围的线条或曲线。本节讨论了使用轮廓进行图像分割。
如何做…
- 导入计算机视觉包 -
cv2
:
import cv2 # Import Numerical Python package - numpy as np import numpy as np
- 使用内置的
imread
函数读取图像:
image = cv2.imread('image_5.jpg')
- 使用内置的
imshow
函数显示原始图像:
cv2.imshow("Original", image)
- 等待按任意键:
cv2.waitKey(0)
- 执行
Canny
边缘检测系统:
# cv2.Canny is the built-in function used to detect edges # cv2.Canny(image, threshold_1, threshold_2) canny = cv2.Canny(image, 50, 200)
- 使用内置的
imshow
函数显示检测到的边缘输出图像:
cv2.imshow("Canny Edge Detection", canny)
- 等待按任意键:
cv2.waitKey(0)
- 执行轮廓检测系统:
# cv2.findContours is the built-in function to find contours # cv2.findContours(canny, contour retrieval mode, contour approximation mode) # contour retrieval mode: cv2.RETR_LIST (retrieves all contours) # contour approximation mode: cv2.CHAIN_APPROX_NONE (stores all boundary points) contours, hierarchy = cv2.findContours(canny, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
- 在图像上勾画轮廓:
# cv2.drawContours is the built-in function to draw contours # cv2.drawContours(image, contours, index of contours, color, thickness) cv2.drawContours(image, contours, -1, (255,0,0), 10) # index of contours = -1 will draw all the contours
- 显示图像的勾画轮廓:
# Display contours using imshow built-in function cv2.imshow("Contours", image)
- 等待按任意键:
cv2.waitKey()
- 终止程序并显示结果:
# Close all windows cv2.destroyAllWindows()
- 执行
Image_Segmentation.py
文件后获得的结果如下所示:
以下是边缘检测输出:
模糊和锐化图像
模糊和锐化是用于增强输入图像的图像处理操作。
如何做…
- 导入计算机视觉包 -
cv2
:
import cv2 # Import Numerical Python package - numpy as np import numpy as np
- 使用内置的
imread
函数读取图像:
image = cv2.imread('image_6.jpg')
- 使用内置的
imshow
函数显示原始图像:
cv2.imshow("Original", image)
- 等待按任意键:
cv2.waitKey(0)
- 执行模糊操作的像素级操作:
# Blurring images: Averaging, cv2.blur built-in function # Averaging: Convolving image with normalized box filter # Convolution: Mathematical operation on 2 functions which produces third function. # Normalized box filter having size 3 x 3 would be: # (1/9) [[1, 1, 1], # [1, 1, 1], # [1, 1, 1]] blur = cv2.blur(image,(9,9)) # (9 x 9) filter is used
- 显示模糊的图像:
cv2.imshow('Blurred', blur)
- 等待按任意键:
cv2.waitKey(0)
- 执行锐化操作的像素级操作:
# Sharpening images: Emphasizes edges in an image kernel = np.array([[-1,-1,-1], [-1,9,-1], [-1,-1,-1]]) # If we don't normalize to 1, image would be brighter or darker respectively # cv2.filter2D is the built-in function used for sharpening images # cv2.filter2D(image, ddepth, kernel) # ddepth = -1, sharpened images will have same depth as original image sharpened = cv2.filter2D(image, -1, kernel)
- 显示锐化后的图像:
cv2.imshow('Sharpened', sharpened)
- 等待按任意键:
cv2.waitKey(0)
- 终止程序执行:
# Close all windows cv2.destroyAllWindows()
- 用于执行
Blurring_Sharpening.py
的命令如下所示:
- 用于执行
Blurring_Sharpening.py
文件的输入图像如下所示:
- 执行
Blurring_Sharpening.py
文件后获得的模糊图像如下所示:
- 执行
Blurring_Sharpening.py
文件后获得的锐化图像如下所示:
在图像中检测边缘
边缘检测用于检测图像中的边界。它提供有关形状和区域属性的详细信息。这包括周长、主轴大小和次轴大小。
如何做…
- 导入必要的包:
import sys import cv2 import numpy as np
- 读取输入图像:
in_file = sys.argv[1] image = cv2.imread(in_file, cv2.IMREAD_GRAYSCALE)
- 实现 Sobel 边缘检测方案:
horizontal_sobel = cv2.Sobel(image, cv2.CV_64F, 1, 0, ksize=5) vertical_sobel = cv2.Sobel(image, cv2.CV_64F, 0, 1, ksize=5) laplacian_img = cv2.Laplacian(image, cv2.CV_64F) canny_img = cv2.Canny(image, 30, 200)
- 显示输入图像及其对应的输出:
cv2.imshow('Original', image) cv2.imshow('horizontal Sobel', horizontal_sobel) cv2.imshow('vertical Sobel', vertical_sobel) cv2.imshow('Laplacian image', laplacian_img) cv2.imshow('Canny image', canny_img)
- 等待操作员的指示:
cv2.waitKey()
- 显示输入图像和相应的结果:
cv2.imshow('Original', image) cv2.imshow('horizontal Sobel', horizontal_sobel) cv2.imshow('vertical Sobel', vertical_sobel) cv2.imshow('Laplacian image', laplacian_img) cv2.imshow('Canny image', canny_img)
- 等待操作员的指示:
cv2.waitKey()
- 用于执行
Detecting_edges.py
Python 程序文件的命令,以及输入图像(baby.jpg
)如下所示:
- 执行
Detecting_edges.py
文件后获得的输入图像和水平 Sobel 滤波器输出如下所示:
- 执行
Detecting_edges.py
文件后获得的垂直 Sobel 滤波器输出和拉普拉斯图像输出如下所示:
以下是拉普拉斯图像输出:
- 执行
Detecting_edges.py
文件后获得的Canny
边缘检测输出如下所示:
它是如何工作的…
读者可以参考以下文档,了解边缘检测是什么,以及它对测试图片的影响:
citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.301.927
另请参见
请参阅以下文档:
直方图均衡化
直方图均衡化用于增强图像的可见性和对比度。它通过改变图像的强度来执行。这些程序在这里有清晰的描述。
如何做…
- 导入必要的包:
import sys import cv2 import numpy as np
- 加载输入图像:
in_file = sys.argv[1] image = cv2.imread(in_file)
- 将 RGB 图像转换为灰度图像:
image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) cv2.imshow('Input grayscale image', image_gray)
- 调整灰度图像的直方图:
image_gray_histoeq = cv2.equalizeHist(image_gray) cv2.imshow('Histogram equalized - grayscale image', image_gray_histoeq)
- 调整 RGB 图像的直方图:
image_yuv = cv2.cvtColor(image, cv2.COLOR_BGR2YUV) image_yuv[:,:,0] = cv2.equalizeHist(image_yuv[:,:,0]) image_histoeq = cv2.cvtColor(image_yuv, cv2.COLOR_YUV2BGR)
- 显示输出图像:
cv2.imshow('Input image', image) cv2.imshow('Histogram equalized - color image', image_histoeq) cv2.waitKey()
- 用于执行
histogram.py
Python 程序文件的命令,以及输入图像(finger.jpg
)如下所示:
- 用于执行
histogram.py
文件的输入图像如下所示:
- 执行
histogram.py
文件后获得的直方图均衡化灰度图像如下所示:
- 执行
histogram.py
文件后获得的直方图均衡化彩色图像如下所示:
在图像中检测角点
角点是图像中用于提取推断图像内容的特殊特征的边界。角点检测经常用于图像配准、视频跟踪、图像拼接、运动检测、3D 建模、全景拼接和物体识别。
如何做…
- 导入必要的包:
import sys import cv2 import numpy as np
- 加载输入图像:
in_file = sys.argv[1] image = cv2.imread(in_file) cv2.imshow('Input image', image) image_gray1 = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) image_gray2 = np.float32(image_gray1)
- 实现 Harris 角点检测方案:
image_harris1 = cv2.cornerHarris(image_gray2, 7, 5, 0.04)
- 膨胀输入图像并构造角点:
image_harris2 = cv2.dilate(image_harris1, None)
- 实现图像阈值处理:
image[image_harris2 > 0.01 * image_harris2.max()] = [0, 0, 0]
- 显示输入图像:
cv2.imshow('Harris Corners', image)
- 等待操作员的指示:
cv2.waitKey()
- 用于执行
Detecting_corner.py
Python 程序文件的命令,以及输入图像(box.jpg
)如下所示:
- 用于执行
Detecting_corner.py
文件的输入图像如下所示:
- 执行
Detecting_corner.py
文件后获得的 Harris 角点如下所示:
要了解它如何作用于输入图片,请参考以下内容:
- 图像角点检测涉及在给定图片中找到边缘/角点。它可以用于从灰度和 RGB 图片中提取重要的形状特征。参考这篇关于边缘和角点检测的调查论文:
pdfs.semanticscholar.org/24dd/6c2c08f5601e140aad5b9170e0c7485f6648.pdf
。