先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Web前端全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip1024c (备注前端)
正文
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, (