最详细的 Opencv--图像提取裁剪
创作时间:
作者:
@小白创作中心
最详细的 Opencv--图像提取裁剪
引用
CSDN
1.
https://blog.csdn.net/m0_71212744/article/details/139746067
本文将详细介绍如何使用OpenCV库对图像进行裁剪,以提取出图像中的特定目标(本例中为小金鱼)。通过灰度转换、高斯滤波、边缘检测、轮廓提取和掩膜设置等步骤,最终实现对目标物体的精准裁剪。
将图像中较大的小金鱼裁剪出来
一、导入必要的库
import cv2
from tools import my_tools
import numpy as np
# 这里的from tools import my_tools 是我自己的一个工具包,里面的my_tools代码具体如下
# 一个resize函数,输入想要缩放的大小,图片长宽会按照等比例缩放
def resize(image, width=None, height=None, inter=cv2.INTER_AREA):
dim = None
(h, w) = image.shape[:2]
if width is None and height is None:
return image
if width is None:
r = height / float(h)
dim = (int(w * r), height)
else:
r = width / float(w)
dim = (width, int(h * r))
resized = cv2.resize(image, dim, interpolation=inter)
return resized
二、读取并预处理图像
1. 读取图像并转换为灰度图
# 打包函数,包含展示图片以及等待
def cv_show(name, image):
cv2.imshow(name, image)
cv2.waitKey(0)
image = cv2.imread('./fish.jpg') # 图片路径根据自己路径设置
# 高设置为500,宽会按照等比例进行缩放
image = my_tools.resize(image, height=500)
cv_show('fish', image)
# 将图片转换为灰度图
image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv_show('image_gray', image_gray)
灰度转换效果展示
三、高斯滤波
高斯滤波是一种用于图像处理的线性平滑滤波技术,可以有效地消除图像中的高频噪声(也称为细节或边缘)。它使用一个二维的高斯函数(或称为高斯核)来与图像的每个像素及其邻域进行卷积,以达到平滑的效果。
作用:整个图像相较于原图像会看起来较为模糊,原图像上的某些噪声点在经过周围像素点加权求和后会被剔除掉。
# 选用3x3的卷积核,sigmaX设为0,确保核不会具有几乎为0的值。这是为了防止除以零或得到接近零的权重。
image_gaussian = cv2.GaussianBlur(image_gray, (3, 3), 0)
cv_show('image_gaussian', image_gaussian)
高斯滤波效果展示
四、边缘检测
Canny边缘检测:cv2.Canny(image, minVal, maxVal)
当一个像素的梯度强度高于maxVal时,它被认为是边缘。当一个像素的梯度强度低于minVal时,它被认为是非边缘,并且会被丢弃。如果一个像素的梯度强度在minVal和maxVal之间,那么它只有在与高于maxVal的像素连接时才会被认为是边缘。
edge = cv2.Canny(image_gaussian, 10, 200)
cv_show('edge', edge)
# 设置一个卷积核
kernel = np.ones((4, 4), np.uint8)
# 对图像做一个闭操作,防止图像边缘轮廓出现断点
edge = cv2.morphologyEx(edge, cv2.MORPH_CLOSE, kernel)
cv_show('edge', edge)
边缘检测效果展示
五、提取小金鱼轮廓
cv2.CHAIN_APPROX_SIMPLE:一种轮廓点的压缩方法,它仅保存轮廓的端点(即轮廓的起点和终点)以及轮廓在水平、垂直和对角线方向上的拐点。通过这种方法,可以有效地减少表示轮廓所需的点的数量,从而提高计算效率。
cnts = cv2.findContours(edge, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[1]
# key=cv2.contourArea对提取到的轮廓进行排序,根据轮廓面积进行排序
# reverse=True面积由大到小进行排序
cnts = sorted(cnts, key=cv2.contourArea, reverse=True)[0] # [0]提取面积最大轮廓
# 将提取到的轮廓绘制出来
image_draw = cv2.drawContours(image.copy(), cnts, -1, (0, 0, 255), 2)
cv_show('image_draw', image_draw)
轮廓提取效果展示
六、设置掩膜
mask = np.zeros(image.shape[:2], dtype=np.uint8)
cv2.drawContours(mask, [cnts], -1, (255, 255, 255), -1)
cv_show('mask', mask)
掩膜设置效果展示
七、图像裁剪
# 将原图进行bitwise_and相加,掩膜为上一步设置的掩膜
image_cut = cv2.bitwise_and(image, image, mask=mask)
cv_show('image_cut', image_cut)
最终裁剪效果展示
总结
要将图像中某一部分裁剪出来就要找到该图像的轮廓,并将掩膜设置为相应位置且大小相等,最后利用掩膜对图像进行加权求和提取出来对应图像。
OpenCV:功能更强大,提供了许多计算机视觉和图像处理的算法,包括图像滤波、特征检测、目标跟踪等。OpenCV在处理视频和实时图像处理方面也有很好的性能。
热门推荐
煤炭开发环境代价巨大:土地破坏、水资源污染、大气污染持续恶化
动力煤价格波动解析:从供需到政策的全方位影响
智能化重塑煤炭开采,统一标准成行业发展关键
西宁至成都自驾游必备:车辆检查与保养秘籍
二手车选购全攻略:从预算设定到车况检查
冬季行车安全:底盘胶套检查与更换指南
底盘胶套磨损,教你告别车辆异响
根管治疗后防复发:口腔卫生与饮食习惯是关键
根管治疗效果如何?90%患者疼痛可缓解,这些指标帮你判断
根管治疗:90%成功率,术后护理是关键
2-4周完成根管治疗,这些细节助你安心就医
农大蔬菜卷虚假宣传被曝光,13款涉农字号零食5款造假
物流仓库管理流程包括哪些
快递投诉解决指南:5个实用技巧和多种解决方案
成都周边徒步攻略:竹海、彩林里的秋日私语
成都出发!峨眉山金顶日出+金口大峡谷探险,3天自驾游玩转四川两大美景
成都周边冬日自驾游打卡地:冰雪世界里的童话之旅
股指期货交割日临近,股市波动如何应对?
股指交割日下跌全解析:从基本面到技术面的影响因素
根管治疗常见不适及应对:30%患者术后会疼痛
根管治疗详解:1-3次就诊,6步恢复牙齿健康
一文读懂根管治疗:步骤详解与常见误区
根管治疗技术革新:显微、超声等新技术提升治疗效果
老年人如何避开信托理财诈骗?
大数据揭秘:如何识破网络诈骗套路?
警惕!共享屏幕诈骗盯上学生群体,这些套路要当心
诈骗套路深,教你如何用法律武器反击
大学生暑期兼职防骗指南:这些套路要当心!
网络兼职防坑指南:这八个技巧太实用了!
西建大管理学院发布最新兼职防骗指南:八大要点助你远离诈骗陷阱