使用opencv分割图像(python实现)

使用opencv分割图像(python实现)

  1. 概述
    本人在做无人农机的时候需要进行图像处理,寻找目标物并进行分割,于是总结网络各种小车寻迹等等demo,自己也终于把图像颜色分割做的七七八八,特来记录一下,留作以后参考。
  2. 过程
  • 导包
import numpy as np
import cv2
  • 读取图片(此处可以换成视频流,具体可以百度一下,原理相同,都是对一帧图片进行处理)
image = cv2.imread("C:/Users/92803/Downloads/1.jpg")
  • 对想要的颜色进行二值化处理
lower_blue = np.array([100,43,46])
upper_blue = np.array([124,255,255])
imgHSV = cv2.cvtColor(image,cv2.COLOR_BGR2HSV)
cv_image = cv2.inRange(imgHSV,lower_blue,upper_blue)
#cv_image已经是二值矩阵了

首先,图片从BGR格式转为HSV格式,因为RGB格式的图片在显示上非常方便,但是对于图像处理HSV格式是比较常用的,具体可以查看HSV格式和RGB格式的区别。
其次,cv2.inRange就是将HSV格式的图像进行二值化,在lower_blue和upper_blue之间的填充255,其余的都填充0。
具体各种颜色的值参考以下图片:
这是通过实验计算的模糊范围
我以上填写的是过滤蓝色,填写对应的值就可以了。

  • 过滤之后发现还有一些噪点,于是接着对图像进行腐蚀和膨胀:
#对图片进行腐蚀操作
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(10,10))
#这里的参数是选择卷积核的大小
cv_image = cv2.erode(cv_image,kernel)
#对图片进行膨胀操作
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(10,10))
cv_image = cv2.dilate(cv_image,kernel)
  • 如果对结果还不满意,还可以对连通区域的面积进行过滤
contours,hie = cv2.findContours(cv_image,cv2.RETR_LIST,cv2.CHAIN_APPROX_NONE)
'''
调用函数发现图像中的连通区域,注意这里opencv3返回的是三个参数即image,contours,hie
contours与hie一一对应,根据findContours寻找的模式,contours可以找到连通区域的所有点轮廓,转折点轮廓等,此处是找所有点轮廓。
len(contours)返回的是连通区域的个数
'''
contours = np.array(contours,dtype=object)
#以上contours返回的是一个元组形式,转为ndarray格式,方便处理
index = 0
for contour in contours:
    area = cv2.contourArea(contour)
    #调用函数,求取连通区域面积(像素点个数)
    if area < 10000:
    	#设置阈值
        cv2.drawContours(cv_image,contour[np.newaxis,:],-1,(0,0,0),cv2.FILLED)
        #对于面积小于10000像素的连通区域,进行填充黑色(本来是白色)
        contours = np.delete(contours,index)
        #从contours 中删除
        index = index-1
        #同时索引减1
    index = index + 1
    #自增1
    
for index,contour in enumerate(contours):
    x,y,w,h = cv2.boundingRect(contour)
    cv2.rectangle(cv_image,(x,y),(x+w,y+h),(139,35,35),5)
    #对于面积大于等于10000连通区域在图像中画出矩形

对于为什么不放在一个for循环中,是因为有的连通预期画出矩形之后,然后填充面积不符合的区域,可能会把画的矩形框给擦除,所以分两步进行处理。

  • 显示图片
cv2.imshow("image",cv_image)

#这一步是必须的,不加会报错
cv2.waitKey(0)

参考资料:
1: cv2.findContours()函数
2:OpenCV-清除小面积连通域
3:HSV基本颜色分量范围
4:三分钟带你快速学习RGB、HSV和HSL颜色空间
5:cv2.inRange函数
----------------------------------------分割线-----------------------------------------------------------------------

  • 对于以上的代码可能会发生错误核心修改代码如下:
 #标记连通区域并删除小区域的连通区域
            cv_image,contours,hierarchy = cv2.findContours(image=cv_image,mode=cv2.RETR_LIST,method=cv2.CHAIN_APPROX_NONE)
            if len(contours)!=0:
                #contours = np.array(contours,dtype=cv2.UMat)
                contours2 = ()
                for contour in contours:
                    area = cv2.contourArea(contour)
                    if area< 10000:
                        cv2.drawContours(cv_image,tuple([contour]),-1,(0,0,0),cv2.FILLED)
                        #contours = np.delete(contours,index)
                    else:
                        contours2 = contours2 + tuple([contour])
                for contour in contours2:
                    x,y,w,h = cv2.boundingRect(contour)
                    cv2.rectangle(cv_image,(x,y),(x+w,y+h),(139,35,35),5)

如果显示的是灰度图和ros进行转换要注意参数的设置

self.image_pub.publish(self.bridge.cv2_to_imgmsg(cv_image, "mono8"))
  • 1
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
通过使用OpenCV库和Python编程语言,可以实现图像分割的任务。下面是一种基于K-means聚类算法的图像分割方法的示例代码: ``` python import cv2 import numpy as np # 读取图像 img = cv2.imread("path_to_image.jpg") # 将图像转换为灰度图 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 使用K-means聚类算法进行图像分割 Z = gray.reshape((-1, 1)) Z = np.float32(Z) criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0) k = 2 # 聚类中心个数 ret, label, center = cv2.kmeans(Z, k, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS) center = np.uint8(center) res = center[label.flatten()] segmented_img = res.reshape((gray.shape)) # 显示分割结果 cv2.imshow("Segmented Image", segmented_img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 上述代码首先读取图像,并将其转换为灰度图像。然后使用K-means聚类算法对灰度图像进行分割,将像素值聚类为k个类别。最后,将分割结果可视化显示出来。 请注意,上述代码只是图像分割中的一种方法,其他图像分割方法也可以使用OpenCV中的不同函数来实现。具体选择哪种方法取决于实际需求和图像特征。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Python 计算机视觉(十二)—— OpenCV 进行图像分割](https://blog.csdn.net/qq_52309640/article/details/120941157)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值