网站首页 > 技术文章 正文
让我们以一个简单的场景为例,在该场景中我们有一个柠檬图像,我们想要对其中的柠檬进行分割和计数。
图像分割算法有分水岭算法、斑点计数算法、霍夫圆/椭圆算法、轮廓检测算法等。在本文中,我使用了轮廓检测和分水岭算法。
涉及的步骤:
- 读取图像
- 转换为HSV
- 阈值
- 模糊它
- 删除多余/不需要的区域
- 在原始图像上绘制轮廓
- 使用分水岭来检测分离轮廓
- 进行平均分水岭和轮廓检测以获得满意的结果。
首先,我们导入一些常见的Python依赖项。
from __future__ import print_function
import numpy as np
import cv2
import matplotlib.pyplot as plt
%matplotlib inline
from skimage import io
from skimage.morphology import watershed
from skimage.feature import peak_local_max
from scipy import ndimage
我们创建一个Python函数以可视化图像。Python代码如下:
def show(img):
plt.imshow(img)
plt.show()
现在,我们读取图像。
#load
fp = "lemons1.jpg"
img = cv2.imread(fp)
show(img)
print(img.shape)
现在,我们对图像进行预处理。步骤包括:
- HSV,这是人眼感知的颜色模型。
- 阈值技术,通过选定的阈值像素强度将图像转换为二值图像(即只有2个像素值(0或255))。
- 模糊图像,以删除图像中不必要的斑点。
#preprocessing the image
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
show(hsv)
h, s, v = cv2.split(hsv)
show(s)
_, thr = cv2.threshold(s, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
show(thr)
blur = cv2.medianBlur(thr, 5)
show(blur)
现在我们使用轮廓检测,在我们“模糊”的图像中找到柠檬。为了去除小的和无关紧要的轮廓,我们只选择那些面积大于2000的轮廓(任意值,是超参数)。
contours, hierarchy = cv2.findContours(blur,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
copy2 = img.copy()
count = []
for x in contours:
area = cv2.contourArea(x)
if area > 2000 :
count.append(x)
cv2.drawContours(copy2, count, -1, (255,0,0), 3)
show(copy2)
print("number of lemons found via contour detection = ", len(count))
现在我们使用分水岭算法来分离相互接触的柠檬(如果有的话)。
copy3 = img.copy()
D = ndimage.distance_transform_edt(thr)
localMax = peak_local_max(D, indices=False, min_distance=70,
labels=thr)
markers = ndimage.label(localMax, structure=np.ones((3, 3)))[0]
labels = watershed(-D, markers, mask=thr)
ws = len(np.unique(labels)) -1
copy3[labels == -1] = [255,0,0]
print("no. of lemons found via watershed algorithm = ", ws)
最后我们取两种方法的平均值并打印结果。
ans = int((len(count) + len(np.unique(labels)) -1) / 2)
print("number of lemon segments detected = ", ans)
show(copy2)
猜你喜欢
- 2024-10-12 智能监测:皮带输送系统堵料问题的解决方案
- 2024-10-12 Python-OpenCV 10. 图像边缘算法 opencv边缘识别
- 2024-10-12 Net AI学习笔记系列第五章 net教程
- 2024-10-12 深度学习和神经网络——图像读取和显示
- 2024-10-12 十三句Python搞定找茬游戏 找茬游戏规则
- 2024-10-12 「深度学习」手把手教你用PythonOpenCV物体识别-识别水果
- 2024-10-12 python代码实现OpenCV 轮廓近似原理
- 2024-10-12 OpenCV找出图片中的圆并标注圆心 opencv检测圆代码
- 2024-10-12 分享3个干货满满的Python实战项目,点赞收藏
- 2024-10-12 OpenCV(28)——凸包 opencv轮廓凹凸
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)