python scikit-image提取图片轮廓并输出结果图
时间: 2024-10-15 17:15:09 浏览: 115
在Python的scikit-image库中,你可以使用`skimage.measure.find_contours()`函数来提取图像的轮廓。这个函数接收一个二值图像作为输入,并返回轮廓的坐标列表。以下是一个简单的步骤示例:
```python
from skimage import io, measure
import matplotlib.pyplot as plt
# 加载图片
img = io.imread('your_image_path.png', as_gray=True) # 确保图片是灰度图
# 将图片转换为二值图像(0代表背景,255代表前景)
_, img_binary = threshold_BINARY(img)
# 提取轮廓
contours = measure.find_contours(img_binary, 0.5) # 阈值可以根据需要调整
# 绘制原图和轮廓
fig, ax = plt.subplots(figsize=(8, 6))
ax.imshow(img, cmap='gray')
for contour in contours:
ax.plot(contour[:, 1], contour[:, 0], linewidth=2)
plt.show()
```
在这个例子中,`find_contours()`返回的是每个轮廓的一系列x和y坐标点。然后你可以用matplotlib将这些坐标画出来形成轮廓线。
相关问题
python scikit-image提取图片轮廓
在Python的scikit-image库中,可以使用`skimage.measure.find_contours()`函数来提取图片的轮廓。这个函数基于OpenCV的轮廓检测功能,通常用于二值图像处理,也就是灰度图像中黑背景与白前景之间的边缘检测。
首先,你需要对图像进行预处理,比如转换为二值图像,这可以通过阈值化、Otsu's阈值法等方法实现。然后,调用`find_contours()`,传入处理后的二值图像以及一个布尔值表示是否闭合轮廓:
```python
from skimage import io, measure
import numpy as np
# 加载图像
img = io.imread('your_image.png', as_gray=True)
# 转换为二值图像(例如,这里使用全局阈值)
threshold = 0.5
binary_img = img > threshold
# 提取轮廓
contours, _ = measure.find_contours(binary_img, 0.5) # 第二个参数通常是轮廓连接模式
# 现在contours是一个numpy数组,每个轮廓是一个二维数组,包含了轮廓上各点的(x, y)坐标
```
Python中如何对一张图片操作灰度,滤波降噪,二值化,边缘检测,轮廓提取等操作,提取到图片中的圆以及圆的坐标
在Python中,我们可以使用一些图像处理库如PIL(Python Imaging Library),OpenCV或scikit-image来进行图片的各种操作。这里简单描述一下:
1. **灰度转换**:
使用`PIL`库的`convert()`函数可以将图片转换为灰度,例如:
```python
from PIL import Image
img = Image.open('image.jpg')
gray_img = img.convert('L')
```
2. **滤波降噪**:
OpenCV提供了多种滤波器,如高斯滤波(`cv2.GaussianBlur()`)或中值滤波(`cv2.medianBlur()`)。例如:
```python
import cv2
noisy_img = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)
blurred_img = cv2.GaussianBlur(noisy_img, (5, 5), 0)
```
3. **二值化**:
使用阈值分割(`cv2.threshold()`)或者Otsu's算法(`cv2.threshold()`中的`cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU`)来将灰度图转为二值图:
```python
_, binary_img = cv2.threshold(blurred_img, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
```
4. **边缘检测**:
边缘检测可以用Sobel算子(`cv2.Canny()`)或Cv2的`findContours()`函数结合霍夫变换(`cv2.HoughCircles()`)寻找圆形特征:
```python
edges = cv2.Canny(binary_img, 50, 150)
circles = cv2.HoughCircles(edges, cv2.HOUGH_GRADIENT, dp=1, minDist=50, param1=50, param2=30, minRadius=0, maxRadius=0)
```
5. **轮廓提取**:
要提取轮廓,首先找到边缘,然后使用`findContours()`:
```python
contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
```
6. **提取圆及坐标**:
如果`HoughCircles()`成功找到圆,结果会是一个数组,每个元素包含圆心坐标和半径。例如:
```python
if circles is not None:
circles = np.round(circles[0, :]).astype("int")
for (x, y, r) in circles:
print(f"Circle found at ({x}, {y}) with radius {r}")
else:
print("No circles detected.")
```
阅读全文