如何进行区域分割图像,将目标区域和背景区域保存起来,并且分别画出他们的各自的直方图并显示python代码
时间: 2024-05-06 15:17:21 浏览: 66
图像区域分割是图像处理中非常重要的一部分,可以通过分割图像来提取出目标区域和背景区域,从而更好地进行后续的处理和分析。以下是使用Python进行图像区域分割并绘制直方图的示例代码:
```python
import cv2
import numpy as np
from matplotlib import pyplot as plt
# 读取图像
img = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)
# 阈值分割
ret, thresh = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
# 寻找轮廓
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# 计算轮廓面积
areas = []
for contour in contours:
area = cv2.contourArea(contour)
areas.append(area)
# 找到面积最大的轮廓
max_index = np.argmax(areas)
cnt = contours[max_index]
# 创建掩膜
mask = np.zeros(img.shape, np.uint8)
cv2.drawContours(mask, [cnt], 0, 255, -1)
# 应用掩膜
res = cv2.bitwise_and(img, img, mask=mask)
# 分别绘制直方图
hist_full = cv2.calcHist([img], [0], None, [256], [0, 256])
hist_mask = cv2.calcHist([img], [0], mask, [256], [0, 256])
# 显示图像和直方图
plt.subplot(221), plt.imshow(img, 'gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(222), plt.imshow(mask, 'gray')
plt.title('Mask'), plt.xticks([]), plt.yticks([])
plt.subplot(223), plt.imshow(res, 'gray')
plt.title('Result'), plt.xticks([]), plt.yticks([])
plt.subplot(224), plt.plot(hist_full)
plt.plot(hist_mask)
plt.title('Histogram'), plt.xlim([0, 256])
plt.show()
```
在上述代码中,首先读取一张灰度图像,然后使用阈值分割将图像转换为二值图像。接着使用`cv2.findContours`函数寻找图像中的轮廓,并计算每个轮廓的面积。然后找到面积最大的轮廓,并使用`cv2.drawContours`函数创建一个掩膜,将掩膜应用于原始图像上,得到目标区域。最后使用`cv2.calcHist`函数分别计算目标区域和背景区域的直方图,并使用`matplotlib`库绘制直方图和显示图像。
阅读全文