100张图片作为识别训练集,每张图片内都有一个黑色框形,用python识别出并提取该框形,以棋盘格坐标,按4:6平均划分区域后,输出图片
时间: 2024-03-08 11:49:17 浏览: 101
首先,需要使用 OpenCV 库读取并处理图片,然后使用图像处理技术检测出黑色框形。可以使用以下步骤:
1. 导入所需库:
```python
import cv2
import numpy as np
```
2. 读取图片:
```python
img = cv2.imread('image.jpg')
```
3. 转换为灰度图像:
```python
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
```
4. 使用二值化将图像转换为黑白图像:
```python
ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
```
这里使用了 Otsu 自适应二值化算法。
5. 查找轮廓并筛选出黑色框形:
```python
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
for cnt in contours:
# 计算轮廓面积
area = cv2.contourArea(cnt)
if area > 1000 and area < 10000:
# 计算轮廓周长
perimeter = cv2.arcLength(cnt, True)
# 多边形逼近
approx = cv2.approxPolyDP(cnt, 0.01 * perimeter, True)
# 判断是否为矩形
if len(approx) == 4:
x, y, w, h = cv2.boundingRect(cnt)
# 绘制矩形
cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)
break
```
这里使用了 findContours 函数查找轮廓,arcLength 函数计算轮廓周长,approxPolyDP 函数进行多边形逼近,boundingRect 函数计算矩形边界框。
6. 将图片划分为 4x6 的网格,并输出分割后的图片:
```python
rows, cols, _ = img.shape
row_step = rows // 4
col_step = cols // 6
for i in range(4):
for j in range(6):
roi = img[i*row_step:(i+1)*row_step, j*col_step:(j+1)*col_step]
cv2.imshow('ROI', roi)
cv2.imwrite('ROI_{}_{}.jpg'.format(i, j), roi)
cv2.waitKey(0)
```
这里使用了 shape 函数获取图片的高度和宽度,然后按照 4:6 的比例分割为若干个小区域,逐个输出。使用 imshow 函数显示分割后的小区域,使用 imwrite 函数将小区域保存为图片,使用 waitKey 函数等待用户按下任意键。
最终代码如下:
```python
import cv2
import numpy as np
# 读取图片
img = cv2.imread('image.jpg')
# 转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 二值化
ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
# 查找轮廓并筛选出黑色框形
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
for cnt in contours:
area = cv2.contourArea(cnt)
if area > 1000 and area < 10000:
perimeter = cv2.arcLength(cnt, True)
approx = cv2.approxPolyDP(cnt, 0.01 * perimeter, True)
if len(approx) == 4:
x, y, w, h = cv2.boundingRect(cnt)
cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)
break
# 划分为 4x6 的网格并输出分割后的图片
rows, cols, _ = img.shape
row_step = rows // 4
col_step = cols // 6
for i in range(4):
for j in range(6):
roi = img[i*row_step:(i+1)*row_step, j*col_step:(j+1)*col_step]
cv2.imshow('ROI', roi)
cv2.imwrite('ROI_{}_{}.jpg'.format(i, j), roi)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
阅读全文