最详细的 Opencv--图像提取裁剪

目录

一、裁剪效果展示

二、具体实现操作

1.导入相应的库

2.读取相应图片并转换为灰度图

1)代码部分

2)效果展示

3.高斯滤波 

1)代码部分

2)效果展示

4.边缘检测 

1)代码部分

2)效果展示

 5.提取小金鱼轮廓

1)代码部分

2)效果展示

 6.设置掩膜

1)代码部分

2)效果展示

7.图像裁剪 

1)代码部分

2)效果展示

三、总结 


对于部分操作或参数有疑惑的,或者想了解更多opencv操作的可前往OpenCV操作教程

一、裁剪效果展示

将图像中较大的小金鱼裁剪出来 

二、具体实现操作

1.导入相应的库

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

2.读取相应图片并转换为灰度图

方便后续处理图像并提取轮廓

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)

2)效果展示

3.高斯滤波 

        高斯滤波是一种用于图像处理的线性平滑滤波技术,可以有效地消除图像中的高频噪声(也称为细节或边缘)。它使用一个二维的高斯函数(或称为高斯核)来与图像的每个像素及其邻域进行卷积,以达到平滑的效果。

作用:整个图像相较于原图像会看起来较为模糊,原图像上的某些噪声点在经过周围像素点加权求和后会被剔除掉。

1)代码部分

#选用3x3的卷积核,sigmaX设为0,确保核不会具有几乎为0的值。这是为了防止除以零或得到接近零的权重。
image_gaussian = cv2.GaussianBlur(image_gray, (3, 3), 0)
cv_show('image_gaussian', image_gaussian)

2)效果展示

4.边缘检测 

Canny边缘检测:cv2.Canny(image, minVal, maxVal)

当一个像素的梯度强度高于maxVal时,它被认为是边缘。

当一个像素的梯度强度低于minVal时,它被认为是非边缘,并且会被丢弃。

如果一个像素的梯度强度在minValmaxVal之间,那么它只有在与高于maxVal的像素连接时才会被认为是边缘。

1)代码部分

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)

2)效果展示

 5.提取小金鱼轮廓

cv2.CHAIN_APPROX_SIMPLE :一种轮廓点的压缩方法,它仅保存轮廓的端点(即轮廓的起点和终点)以及轮廓在水平、垂直和对角线方向上的拐点。通过这种方法,可以有效地减少表示轮廓所需的点的数量,从而提高计算效率。

1)代码部分

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)

2)效果展示

这里采用cv2.CHAIN_APPROX_SIMPLE,所以轮廓会保存各个点的位置

 6.设置掩膜

1)代码部分

mask = np.zeros(image.shape[:2], dtype=np.uint8)

cv2.drawContours(mask, [cnts], -1, (255, 255, 255), -1)
cv_show('mask', mask)

2)效果展示

7.图像裁剪 

1)代码部分

#将原图进行bitwise_and相加,掩膜为上一步设置的掩膜
image_cut = cv2.bitwise_and(image, image, mask=mask)
cv_show('image_cut', image_cut)

2)效果展示

三、总结 

        要将图像中某一部分裁剪出来就要找到该图像的轮廓,并将掩膜设置为相应位置且大小相等,最后利用掩膜对图像进行加权求和提取出来对应图像。

        OpenCV:功能更强大,提供了许多计算机视觉和图像处理的算法,包括图像滤波、特征检测、目标跟踪等。OpenCV在处理视频和实时图像处理方面也有很好的性能。

  • 9
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值