OpenCV 图像处理四(轮廓查找、画线、矩特征、轮廓),这份火爆全网的452页Web前端 Framework内核解析

本文详细介绍了使用OpenCV进行图像处理的多个方面,包括读取和转换图像、二值化、寻找轮廓、计算轮廓特征、轮廓绘制以及形状匹配。通过实例展示了如何使用OpenCV的函数来检测和分析图像中的轮廓,如计算面积、弧长、边界矩形、最小外包矩形和最小面积外接圆。同时,文章也提及了如何使用matplotlib进行图像显示和轮廓绘制。内容适合对图像处理感兴趣的前端开发者学习。
摘要由CSDN通过智能技术生成

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Web前端全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024c (备注前端)
img

正文

o = cv2.imread(‘contours.bmp’)
plt.imshow(cv2.cvtColor(o, cv2.COLOR_BGR2RGB))
plt.title(‘Original Image’)
plt.show()


	* 使用 OpenCV 读取名为 ‘contours.bmp’ 的图像。
	* 将图像转换为 RGB 格式,并使用 Matplotlib 显示原始图像。
2. **灰度转换和二值化:**

 

gray = cv2.cvtColor(o, cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)


	* 将原始图像转换为灰度图。
	* 对灰度图进行二值化处理。
3. **查找轮廓:**

 

image, contours, hierarchy = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)


	* 使用 `cv2.findContours()` 函数查找二值图像中的轮廓。
	* `cv2.RETR_EXTERNAL` 参数表示只检测外部轮廓。
	* `cv2.CHAIN_APPROX_SIMPLE` 参数表示使用简化的轮廓表示。
4. **绘制并显示每个轮廓:**

 

n = len(contours)
contoursImg = []

for i in range(n):
temp = np.zeros(o.shape, np.uint8)
contoursImg.append(temp)
contoursImg[i] = cv2.drawContours(contoursImg[i], contours, i, (255, 255, 255), 5)

# Display each contour using plt
plt.imshow(cv2.cvtColor(contoursImg[i], cv2.COLOR_BGR2RGB))
plt.title(f'Contour {i + 1}')
plt.show()

	* 遍历所有检测到的轮廓,每个轮廓都被绘制在 `contoursImg` 的相应元素中。
	* 使用 Matplotlib 显示每个绘制了轮廓的图像,标题显示轮廓的序号。


总体而言,这段代码的目的是在原始图像中找到轮廓,然后将每个轮廓在图像上绘制出来并使用 Matplotlib 逐个显示,以便用户更好地理解轮廓检测的结果。


## 三、矩特征:用于描述图像的形状、轮廓和其他特征的数学描述符


矩可以得到图像的形状和结构信息,可以用来识别图像中的对象、测量物体的大小和姿态等。


矩的能力包括对图像的特征提取、形状匹配、边缘检测等,可以帮助计算机视觉系统理解和处理图像信息。


### 3.1 `cv2.moments()`:该函数计算图像的矩


函数原型为:



cv2.moments(array[, binaryImage])



请注意,要正确使用cv2.moments()函数,
需要先加载图像并将其转换为灰度图像


**参数**:


* `array`:这个参数可以是一个点集(contour),也可以是灰度图像或二值图像。当`array`是一个点集时,函数会将这些点看作轮廓的顶点,将整个点集作为一个轮廓,而不是将它们视为独立点
* `binaryImage`:可选参数,默认为`False`。如果设置为`True`,`array`内的所有非零值都会被处理为1,这样函数会将其视为二值图像进行处理。


**返回值**:  
 字典对象,包含了图像的矩特征。



> 
> (1)空间矩  
>  零阶矩:m00  
>  一阶矩:m10, m01  
>  二阶矩:m20, m11, m02  
>  三阶矩:m30, m21, m12, m03  
>  (2)中心矩  
>  二阶中心矩:mu20, mu11, mu02  
>  三阶中心矩:mu30, mu21, mu12,mu03  
>  (3)归一化中心矩  
>  二阶 Hu 矩:nu20, nu11, nu02  
>  三阶 Hu 矩:nu30, nu21, nu12, nu03
> 
> 
> 



> 
> GPT  
>  ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/5ac5b707dd4541518e7131c22d31c987.png)
> 
> 
> 


#### Demo



import cv2
import numpy as np

读取图片

image = cv2.imread(“img/img.png”)
cv2.imshow(“Original Image”, image)

形态学处理

kernel = np.ones((14, 14), np.uint8)
morphology_result = cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel)
cv2.imshow(“Morphology Result”, morphology_result)

灰度转换

gray_image = cv2.cvtColor(morphology_result, cv2.COLOR_BGR2GRAY)

二值化

_, binary_image = cv2.threshold(gray_image, 100, 255, cv2.THRESH_OTSU)
cv2.imshow(“Binary Image”, binary_image)

寻找轮廓

contours, _ = cv2.findContours(binary_image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

n = len(contours)
contoursImg = []
for i in range(n):
temp = np.zeros(image.shape, np.uint8)
contoursImg.append(temp)
contoursImg[i] = cv2.drawContours(contoursImg[i], contours, i, 255, 3)
cv2.imshow(“contours[” + str(i) + “]”, contoursImg[i])
print(“观察各个轮廓的矩(moments):”)
for i in range(n):
print(“轮廓” + str(i) + “的矩:\n”, cv2.moments(contours[i]))
print(“观察各个轮廓的面积:”)
for i in range(n):
print(“轮廓” + str(i) + “的面积:%d” % cv2.moments(contours[i])[‘m00’])
cv2.waitKey(0)
cv2.destroyAllWindows()



> 
> ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/c9c00d548bea446bb345f36607f07b8e.png)
> 
> 
> 
> ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/1c9e821dc2544615a7fc4e8751b10b20.png)
> 
> 
> 


### 3.2 `cv2.contourArea()`计算图像中对象的大小


函数原型为:



cv2.contourArea(contour [, oriented] ))


**参数:**


* **contour**: 轮廓对象,是一个包含轮廓点坐标的数组。
* **oriented (可选)**: 一个布尔值,指定是否计算有方向的面积。默认为 `False`,表示计算无方向的面积。如果设置为 `True`,则计算有方向的面积。


**返回值:**


该函数返回轮廓的面积,单位为像素。如果计算有方向的面积,返回的值可能为负数。


#### 示例:



import cv2
import numpy as np

创建一张图像并找到轮廓

image = np.zeros((100, 100), dtype=np.uint8)
cv2.rectangle(image, (

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值