opencv图像剪切,保存局部,图像抠取

本文介绍了使用OpenCV进行图像剪切的步骤,包括设置ROI、创建新图像、复制源图像到新图像以及释放ROI区域。通过这些步骤,可以实现对图像的精确剪切和局部保存。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

### OpenCV 图像分割简介 图像分割是指将数字图像细分为多个部分(像素集合),以便更好地理解和分析图像内容的过程。它是计算机视觉的一个重要环节,广泛应用于目标检测、医学成像等领域。OpenCV作为一个开源的跨平台计算机视觉库,提供了多种强大的功能来帮助我们实现高效的图像处理与分割任务。 #### 1. **阈值法** 这是最简单的灰度化和二值化技术之一。设定一个或若干个阈值点,低于此值的所有像素被认为是背景色,其余则归为目标前景颜色。这种方法适用于对比度较高的单通道(黑白)图像。 - 示例代码: ```python import cv2 img = cv2.imread('input_image.jpg',0) # 加载为灰度模式 ret,thresh_img = cv2.threshold(img,127,255,cv2.THRESH_BINARY) # 应用固定阈值进行二值化 ``` 此外还有自适应阈值方法,允许动态计算局部区域的最佳阈值,从而更适合复杂光照条件下的场景。 #### 2. **边缘检测** 利用Canny Edge Detector或者其他算子如Sobel/Scharr/Prewitt/Laplacian等从原图中提显著变化的信息,进而勾勒出物体轮廓线的位置。这对于寻找不规则形状非常有用。 - 使用 Canny 算法的例子: ```python edges = cv2.Canny(gray_blurred, threshold1, threshold2) ``` 其中`gray_blurried`代表模糊过的灰度版本源图像,目的是减少噪声干扰;而两个阈值参数分别决定了高低限幅标准。 #### 3. **分水岭变换 Watershed Transform** 这是一种基于拓扑理论的概念,在图像中有类似“洪水”蔓延的效果——即模拟水流沿地形流动直至汇集至最低洼处停止。该方法非常适合于粘连对象分离的问题解决。首先需要预处理步骤生成标记(marker),然后应用内置watershed()函数即可完成最终划分工作。 - 分水岭算法的应用实例: ```python marker = np.zeros_like(gray, dtype=np.int32) marker[image == 0] = 1 # 设定外部边界标签为1 marker[markers == -1] = 2 # 内部种子点设置为另一个整数值 watershed_result=cv2.watershed(image.astype(np.uint8),marker) image[watershed_result==-1]=[255,0,0] ``` 此处假设已经有了初步轮廓信息存储在变量`markers`内,并且希望用水蓝色表示最终切割结果中的未知区段。 #### 4. **GrabCut 技术** 抓剪切是一种交互式的图形编辑工具,旨在让用户轻松地选择感兴趣的对象并将其准确地出来。用户只需简单指定大概范围内的前景区和背景区位置,系统就能自动推断剩余不确定区域归属情况。这背后依赖于一种概率图模型(GMMs)+EM优化策略组合而成的强大算法框架支持。 - GrabCut 的Python接口演示: ```python mask = np.zeros(image.shape[:2],np.uint8) bgdModel = np.zeros((1,65),np.float64) fgdModel = np.zeros((1,65),np.float64) rect = (startX,startY,endX,endY) # 定义矩形框选区 cv2.grabCut(image,mask,rect,bgdModel,fgdModel,iterations,cv2.GC_INIT_WITH_RECT) mask2 = np.where((mask==2)|(mask==0),0,1).astype('uint8') output = image*mask2[:,:,np.newaxis] ``` 上面这段脚本实现了给定ROI区域内前景元素的有效裁剪操作。 #### 5. **K-Means 聚类** 虽然严格意义上不属于传统意义上的"分割",但是通过聚类可以很好地达到相似的功能目的。特别是当面对彩色照片时,K-means 可以依据色彩特征自然地把画面划分为不同组块。其原理在于反复迭代找出最优质心向量使得簇间平方误差最小化。 - K-means 颜色量化案例展示: ```python Z = image.reshape((-1,3)) Z = np.float32(Z) criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0) attempts=10 k = 4 # 指定期望得到多少种类别 ret,label,center=cv2.kmeans(Z,k,None,criteria,attempts,cv2.KMEANS_PP_CENTERS) center = np.uint8(center) res = center[label.flatten()] result_image = res.reshape((image.shape)) ``` 在这个例子中,我们将原始BGR空间映射到了仅有的四种典型色调上来简化表达形式,当然也可以根据实际应用场景调整具体的集群数目k。 综上所述,以上只是介绍了几种较为常见的图像分割手段及其对应的openCV实现方式,随着研究进展和技术积累,更多高级别的解决方案也在不断涌现,比如深度学习驱动的目标感知型分割模型。如果你有兴趣深入探讨某一方面的内容或者尝试新的思路,请随时提问!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值