不调用函数im2bw实现二值化
时间: 2024-05-29 18:08:25 浏览: 47
可以使用以下代码实现二值化:
img = cv2.imread('image.jpg', 0) # 读取图像(将图像转为灰度图像)
ret, threshold_img = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY) # 二值化处理
其中,cv2.threshold()函数的参数解释如下:
- img: 原始图像
- 127: 阈值(也就是灰度值127),在此值上下进行二分类(黑色/白色)
- 255: 超过阈值的像素点设置为这个值(白色)
- cv2.THRESH_BINARY: 二值化类型,字面意思是把大于阈值的设为 maxval(255),小于阈值的设为0(也就是黑色)。
相关问题
4.综合运用所学的二维低通与高通滤波器或傅里叶变换对皮革破损进行定位。(没有标准答案) 图2 皮革破损原图leather_org.bmp 图3 皮革破损期望定位二值图 提示: 可以尝试通过直方图观察与试错法确定阈值化的阈值。 可以调用Matlab二值化函数对图像进行二值化:im2bw()。
针对这个问题,我可以提供一个基本思路供您参考:
1. 读入原始图像并显示。
```matlab
img = imread('leather_org.bmp');
figure, imshow(img);
```
2. 将原始图像转换为灰度图像,并对其进行直方图均衡化处理。
```matlab
gray_img = rgb2gray(img);
eq_img = histeq(gray_img);
```
3. 利用高斯低通滤波器平滑图像,去除高频噪声。
```matlab
h = fspecial('gaussian', [3 3], 0.5);
smooth_img = imfilter(eq_img, h);
```
4. 利用Sobel算子检测图像的边缘信息。
```matlab
sobel_h = [-1 0 1; -2 0 2; -1 0 1];
sobel_v = sobel_h';
edge_h = imfilter(smooth_img, sobel_h);
edge_v = imfilter(smooth_img, sobel_v);
edge_img = sqrt(edge_h.^2 + edge_v.^2);
```
5. 对边缘信息进行二值化处理,得到二值图像。
```matlab
threshold = graythresh(edge_img);
bw_img = im2bw(edge_img, threshold);
```
6. 对二值图像进行形态学处理,去除小的噪点和断开的边缘。
```matlab
se = strel('disk', 2);
bw_img = imclose(bw_img, se);
bw_img = imfill(bw_img, 'holes');
```
7. 利用regionprops函数找到所有连通区域,并计算它们的面积和中心位置。
```matlab
stats = regionprops(bw_img, 'Area', 'Centroid');
```
8. 根据面积大小和中心位置,筛选出可能是皮革破损的区域,并在原始图像上进行标记。
```matlab
figure, imshow(img);
hold on;
for i = 1:length(stats)
if stats(i).Area > 200 && stats(i).Area < 500 && stats(i).Centroid(2) > 150 && stats(i).Centroid(2) < 250
rectangle('Position', [stats(i).BoundingBox(1) stats(i).BoundingBox(2) stats(i).BoundingBox(3) stats(i).BoundingBox(4)], 'EdgeColor', 'r', 'LineWidth', 2);
end
end
```
9. 显示结果。
```matlab
title('皮革破损定位结果');
```
希望以上思路能对您有所帮助!这里提供的只是一种可能的解决方法,具体效果可能需要根据实际情况进行调整和优化。
利用图像分割测试cell.tif图像中的微小结构:先调用imcomplement()对图像进行处理,再调用graythresh()函数获取图像阈值,用im2bw( )函数对图像分割;选用大小为6的圆盘结构元素,对分割图像先闭运算结果图B1、再开运算结果图B2,通过B1&B2得到检测结果图。显示原图、分割图像、删除微小结构后图像B2、检测结果的图像(B1&B2)。
好的,我来为你演示一下如何利用图像分割测试 cell.tif 图像中的微小结构。你可以使用 Python 的 OpenCV 库来实现。
首先,我们需要导入图像并进行预处理,包括对图像进行反转(即调用 `imcomplement()` 函数)、获取阈值、对图像进行二值化等操作:
```python
import cv2
# 导入图像并进行预处理
img = cv2.imread('cell.tif')
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img = cv2.bitwise_not(img)
thresh = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
```
接下来,我们可以使用一个大小为 6 的圆盘结构元素对分割图像进行闭运算(即调用 `cv2.morphologyEx()` 函数,使用 `cv2.MORPH_CLOSE` 参数),再进行开运算(即使用 `cv2.MORPH_OPEN` 参数):
```python
# 对分割图像进行闭运算和开运算
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (6, 6))
closed = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
opened = cv2.morphologyEx(closed, cv2.MORPH_OPEN, kernel)
```
最后,我们可以将闭运算和开运算的结果进行交集运算,得到检测结果:
```python
# 对闭运算和开运算的结果进行交集运算,得到检测结果
result = cv2.bitwise_and(closed, opened)
# 显示原图、分割图像、删除微小结构后图像B2、检测结果的图像(B1&B2)
cv2.imshow('original', img)
cv2.imshow('thresholded', thresh)
cv2.imshow('B2', opened)
cv2.imshow('B1&B2', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
你可以根据需要调整结构元素的大小以及阈值等参数,以获得最佳的分割效果。
希望这个例子对你有帮助!
阅读全文