实验内容及要求: 1、测试图像为右边的img1和img2图像,做出该图像的灰度直方图,观察灰度直方图的分布,估计分割背景和目标的大致阈值; 2、使用极小点阈值法确定区域分割的阈值,并用该阈值分割两个图像的背景和目标(转成二值图像),观察分割后的图像; 3、使用迭代阈值法确定区域分割的阈值,并用该阈值分割两个图像的背景和目标(转成二值图像) ,观察分割后的图像; 4、比较两种方法得到的分割图像的质量,解释出现差异的原因以及两种方法的适用条件。 用python实现
时间: 2024-02-09 14:11:39 浏览: 73
Matlab.rar_4 3 2 1_图像代数运算_灰度图像压缩_灰度直方图
好的,我会按照您提供的实验内容及要求来解答您的问题,并使用Python实现。首先,我们需要安装并导入必要的库,例如OpenCV和Matplotlib。您可以使用以下命令安装这些库:
```
pip install opencv-python
pip install matplotlib
```
然后,我们可以使用以下代码加载图像和计算灰度直方图:
```python
import cv2
import matplotlib.pyplot as plt
# 加载图像
img1 = cv2.imread('img1.jpg')
img2 = cv2.imread('img2.jpg')
# 计算灰度直方图
hist1 = cv2.calcHist([cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)], [0], None, [256], [0, 256])
hist2 = cv2.calcHist([cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)], [0], None, [256], [0, 256])
# 显示灰度直方图
plt.figure()
plt.subplot(2,2,1)
plt.imshow(cv2.cvtColor(img1, cv2.COLOR_BGR2RGB))
plt.title('Image 1')
plt.subplot(2,2,2)
plt.plot(hist1)
plt.title('Histogram of Image 1')
plt.subplot(2,2,3)
plt.imshow(cv2.cvtColor(img2, cv2.COLOR_BGR2RGB))
plt.title('Image 2')
plt.subplot(2,2,4)
plt.plot(hist2)
plt.title('Histogram of Image 2')
plt.show()
```
接下来,我们需要根据灰度直方图的分布估计分割背景和目标的大致阈值。一种估计方法是找到灰度直方图的峰值,然后选择峰值左侧的灰度值作为分割阈值。可以使用以下代码来实现:
```python
# 找到灰度直方图的峰值
(pks1, locs1, _, _) = cv2.minMaxLoc(hist1)
(pks2, locs2, _, _) = cv2.minMaxLoc(hist2)
# 选择峰值左侧的灰度值作为分割阈值
threshold1 = locs1 - 50
threshold2 = locs2 - 50
```
接下来,我们可以使用极小点阈值法和迭代阈值法对图像进行分割。极小点阈值法是一种简单的阈值分割方法,它根据图像灰度值的极小点来确定分割阈值。可以使用以下代码来实现:
```python
# 使用极小点阈值法分割图像
_, bw1 = cv2.threshold(cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY), threshold1, 255, cv2.THRESH_BINARY)
_, bw2 = cv2.threshold(cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY), threshold2, 255, cv2.THRESH_BINARY)
# 显示分割后的图像
plt.figure()
plt.subplot(1,2,1)
plt.imshow(bw1, cmap='gray')
plt.title('Segmented Image 1 (Minimum Method)')
plt.subplot(1,2,2)
plt.imshow(bw2, cmap='gray')
plt.title('Segmented Image 2 (Minimum Method)')
plt.show()
```
迭代阈值法是一种更为复杂的阈值分割方法,它通过迭代计算图像的平均灰度值来确定分割阈值。可以使用以下代码来实现:
```python
# 使用迭代阈值法分割图像
bw1 = cv2.adaptiveThreshold(cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY), 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)
bw2 = cv2.adaptiveThreshold(cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY), 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)
# 显示分割后的图像
plt.figure()
plt.subplot(1,2,1)
plt.imshow(bw1, cmap='gray')
plt.title('Segmented Image 1 (Iterative Method)')
plt.subplot(1,2,2)
plt.imshow(bw2, cmap='gray')
plt.title('Segmented Image 2 (Iterative Method)')
plt.show()
```
最后,我们需要比较两种方法得到的分割图像的质量,并解释出现差异的原因以及两种方法的适用条件。极小点阈值法在图像的灰度分布比较明显的情况下效果较好,但在灰度分布不明显的情况下容易产生误分割。迭代阈值法可以适应不同的灰度分布,但在图像噪声较多的情况下容易产生过度分割。因此,选择哪种方法取决于具体的图像特点和应用场景。
阅读全文