Python OpenCV学习总结Day 3.1 图像处理(上篇) 颜色处理与二值化,滤波去噪,形态学腐蚀膨胀,边缘检测

2023-11-02

前言

按照OpenCV官方doc顺序来进行学习回忆和总结,本次的内容是opencv中的图像处理核心技术(imgproc.hpp),包括

  • 颜色处理与二值化
  • 滤波去噪
  • 形态学操作
  • 边缘检测

Day3.1 OpenCV图像处理核心技术(上篇)

颜色处理与二值化

图像处理常用的颜色空间有RGB、HSV、YCbCr、GRAY等

颜色空间转换

使用cv2.cvtColor(img, type)进行颜色空间的转换,需要注意的是imread默认读取图片为BGR

import cv2
import numpy as np

if __name__ == '__main__':
    img = cv2.imread('starry_night.png')
    img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    cv2.imshow('img', img)
    cv2.imshow('img_hsv', img_hsv)
    cv2.imshow('img_gray', img_gray)
    cv2.waitKey(0)

阈值二值化

使用cv2.threshold()进行图像二值化,

需要注意,src必须是单通道图,thresh是阈值,二值化后像素值为{0, maxval},常用的type有
cv2.THRESH_BINARY
cv2.THRESH_BINARY_INV
cv2.THRESH_OTSU

	# ret, dst = cv2.threshold(src, thresh, maxval, type)
    cv2.threshold(img_gray, 100, 255, cv2.THRESH_BINARY)

此外,还有自适应阈值二值化方法,

	# cv2.adaptiveThreshold(src, maxval, method, type, blocksize, C)
	dst = cv2.adaptiveThreshold(src, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 3, 10)

blocksize是分割计算的区域大小,必须是奇数
C表示每个区域计算出阈值后,减去这个常数作为这个区域的最终阈值

颜色阈值筛选

使用cv2.inRange()进行颜色阈值筛选,其中lowerthres和upperthres分别表示长度与图片通道数相同的阈值数组

	# mask = cv2.inRange(img, lowerthres, upperthres)
    mask = cv2.inRange(img_hsv, np.array([100, 40, 40]), np.array([120, 240, 240]))

输入RGB:
在这里插入图片描述
转到HSV空间:
在这里插入图片描述
HSV空间颜色提取:
在这里插入图片描述

滤波去噪

常用的图像滤波方法包括均值滤波,中值滤波,高斯滤波,双边滤波等
均值滤波将中心附近像素累计平均后作为中心值,滤波后图像变模糊
中值滤波取中心附近像素值的中值,适合去除椒盐噪声
高斯滤波采用高斯核进行加权平均,适合去除高斯噪声
双边滤波在滤波时能保持边缘的清晰度

	# 均值滤波cv2.blur(img, Ksize)
    img_blur = cv2.blur(img, (3, 3))
    # 中值滤波cv2.medianBlur(img, Ksize)
    img_median_blur = cv2.medianBlur(img, 3)
    # 高斯滤波cv2.GaussianBlur(img, Ksize, Sigma)
    img_gauss_blur = cv2.GaussianBlur(img, (3, 3), 0)
    # 双边滤波cv2.bilateralFilter(img, d, sigmaColor, sigmaSpace)
    img_bliteral_blur = cv2.bilateralFilter(img, 9, 20, 45)

形态学操作

在图像处理,如二值化、颜色筛选后,目标图案被截断需要截断时,可以通过形态学操作进行填充和削减

腐蚀膨胀

主要针对二值图像,腐蚀是将图像中黑色区域进一步“吞噬”白色区域,膨胀则是让白色区域“吞噬”黑色区域。

在形态学操作前,首先要获得“吞噬”的模板,即核的形状,可选的形状有
cv2.MORPH_RECT
cv2.MORPH_CROSS
cv2.MORPH_ELLIPSE
也可以通过numpy数组自定义核形状

	# 获得核 cv2.getStructuringElement(type, Ksize)
	kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
	# or 自定义核形状
	kernel_np = np.ones([3, 3], np.uint8)
	# 腐蚀 cv2.erode(img, kernel, iterations=None)
	img_erode = cv2.erode(img, kernel)	
	# 膨胀 cv2.dilate(img, kernel)
	img_dilate = cv2.dilate(img, kernel)

开运算与闭运算

先腐蚀将图像中相连的部分截断,再膨胀的操作是开运算
先膨胀将图像中断开的部分连接,再腐蚀的操作是闭运算

	kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
	# 开运算
	img_open = cv2.morphologyEx(src, cv2.MORPH_OPEN, kernel)
	# 闭运算
	img_close = cv2.morphologyEx(src, cv2.MORPH_CLOSE, kernel)

边缘检测

传统边缘检测算法主要采用一阶微分算子Sobel,Roberts,Prewitt等以及二阶算子Canny,Laplace等

Sobel算子

def edge_Sobel(img):
    # Sobel 算子
    x = cv2.Sobel(img, cv2.CV_16S, 1, 0)
    y = cv2.Sobel(img, cv2.CV_16S, 0, 1)

    # 转 uint8 ,图像融合
    X = cv2.convertScaleAbs(x)
    Y = cv2.convertScaleAbs(y)
    img_sobel = cv2.addWeighted(X, 0.5, Y, 0.5, 0)
    return img_sobel

Roberts算子

def edge_Roberts(img):
    # Roberts 算子
    kernelx = np.array([[-1, 0], [0, 1]], dtype=int)
    kernely = np.array([[0, -1], [1, 0]], dtype=int)

    x = cv2.filter2D(img, cv2.CV_16S, kernelx)
    y = cv2.filter2D(img, cv2.CV_16S, kernely)

    X = cv2.convertScaleAbs(x)
    Y = cv2.convertScaleAbs(y)
    img_roberts = cv2.addWeighted(X, 0.5, Y, 0.5, 0)
    return img_roberts

Prewitt算子

def edge_Prewitt(img):
    # Prewitt 算子
    kernelx = np.array([[1, 1, 1], [0, 0, 0], [-1, -1, -1]], dtype=int)
    kernely = np.array([[-1, 0, 1], [-1, 0, 1], [-1, 0, 1]], dtype=int)

    x = cv2.filter2D(img, cv2.CV_16S, kernelx)
    y = cv2.filter2D(img, cv2.CV_16S, kernely)

    # 转 uint8 ,图像融合
    X = cv2.convertScaleAbs(x)
    Y = cv2.convertScaleAbs(y)
    img_prewitt = cv2.addWeighted(X, 0.5, Y, 0.5, 0)
    return img_prewitt

Canny算子

def edge_canny(img):
    # Canny
    dst = cv2.Canny(img, 45, 90)
    img_canny = dst
    return img_canny

Laplace算子

def edge_laplace(img):
    # Laplacian
    dst = cv2.Laplacian(img, cv2.CV_16S, ksize=3)
    img_laplace = cv2.convertScaleAbs(dst)
    return img_laplace

边缘检测测试代码

import cv2
import numpy as np


def edge_Roberts(img):
    # Roberts 算子
    kernelx = np.array([[-1, 0], [0, 1]], dtype=int)
    kernely = np.array([[0, -1], [1, 0]], dtype=int)

    x = cv2.filter2D(img, cv2.CV_16S, kernelx)
    y = cv2.filter2D(img, cv2.CV_16S, kernely)

    X = cv2.convertScaleAbs(x)
    Y = cv2.convertScaleAbs(y)
    img_roberts = cv2.addWeighted(X, 0.5, Y, 0.5, 0)
    return img_roberts


def edge_Prewitt(img):
    # Prewitt 算子
    kernelx = np.array([[1, 1, 1], [0, 0, 0], [-1, -1, -1]], dtype=int)
    kernely = np.array([[-1, 0, 1], [-1, 0, 1], [-1, 0, 1]], dtype=int)

    x = cv2.filter2D(img, cv2.CV_16S, kernelx)
    y = cv2.filter2D(img, cv2.CV_16S, kernely)

    # 转 uint8 ,图像融合
    X = cv2.convertScaleAbs(x)
    Y = cv2.convertScaleAbs(y)
    img_prewitt = cv2.addWeighted(X, 0.5, Y, 0.5, 0)
    return img_prewitt


def edge_Sobel(img):
    # Sobel 算子
    x = cv2.Sobel(img, cv2.CV_16S, 1, 0)
    y = cv2.Sobel(img, cv2.CV_16S, 0, 1)

    # 转 uint8 ,图像融合
    X = cv2.convertScaleAbs(x)
    Y = cv2.convertScaleAbs(y)
    img_sobel = cv2.addWeighted(X, 0.5, Y, 0.5, 0)
    return img_sobel


def edge_laplace(img):
    # Laplacian
    dst = cv2.Laplacian(img, cv2.CV_16S, ksize=3)
    img_laplace = cv2.convertScaleAbs(dst)
    return img_laplace


def edge_canny(img):
    # Canny
    dst = cv2.Canny(img, 45, 90)
    img_canny = dst
    return img_canny


if __name__ == "__main__":
    img = cv2.imread('distorted.png')
    img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    ret, img_thres = cv2.threshold(img_gray, 100, 255, cv2.THRESH_BINARY)
    img_thres = img_gray

    img_roberts = edge_Roberts(img_thres)
    img_prewitt = edge_Prewitt(img_thres)
    img_sobel = edge_Sobel(img_thres)
    img_laplace = edge_laplace(img_thres)
    img_canny = edge_canny(img_thres)
    cv2.imshow('img_roberts', img_roberts)
    cv2.imshow('img_prewitt', img_prewitt)
    cv2.imshow('img_sobel', img_sobel)
    cv2.imshow('img_laplace', img_laplace)
    cv2.imshow('img_canny', img_canny)
    cv2.waitKey(0)

输入:
在这里插入图片描述
Roberts:
在这里插入图片描述
Prewitt:
在这里插入图片描述
Sobel:
在这里插入图片描述
Laplace:
在这里插入图片描述
Canny:
在这里插入图片描述

结语

本次总结回顾了OpenCV图像处理中的核心操作,包括颜色处理,滤波去噪,腐蚀膨胀开闭运算,边缘检测算子。下次将继续学习轮廓操作、霍夫变换和直方图操作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python OpenCV学习总结Day 3.1 图像处理(上篇) 颜色处理与二值化,滤波去噪,形态学腐蚀膨胀,边缘检测 的相关文章

  • 变形:Opencv 使用 Visual Studio 将图像显示到曲面屏幕

    我正在尝试使用 opencv API 来扭曲图像 以便将其显示到曲面屏幕上 我已经浏览了opencv中提供的翘曲apihere http docs opencv org 2 4 modules stitching doc warpers h
  • 如何在没有 OpenCv Manager 的情况下运行 OpenCV 代码

    我正在使用 OpenCV4Android 版本 2 4 10 并在 Samsung Galayx GT I9300 上测试我的代码 我遇到的问题是 我必须从 Play 商店下载 Opencv Manager 以便我的 opencv 代码运行
  • ECC 导致多光谱图像的图像对齐失败

    我正在尝试将 RGB 图像与 IR 图像 单通道 对齐 目标是创建 4 通道图像 R G B IR 为了做到这一点 我正在使用cv2 findTransformECC如中所述这个非常简洁的指南 https learnopencv com i
  • 用于 C++ 中图像分析的 OpenCV 二进制图像掩模

    我正在尝试分析一些图像 这些图像的外部周围有很多噪声 但内部有一个清晰的圆形中心 中心是我感兴趣的部分 但外部噪声正在影响我对图像的二进制阈值处理 为了忽略噪音 我尝试设置一个已知中心位置和半径的圆形蒙版 从而使该圆之外的所有像素都更改为黑
  • OpenCV:视频录制太快

    我有一个简单的录像机 录制来自网络摄像头的视频 theVideoWriter open filename countAsString ext CV FOURCC X V I D 30 Size 1920 1080 true while re
  • OpenCV:使用 StereoCamera 系统对颜色标记进行 3D 姿态估计

    我有一个立体摄像系统并使用两者正确校准它 cv calibrateCamera and cv stereoCalibrate My reprojection error似乎没问题 凸轮0 0 401427 凸轮1 0 388200 立体声
  • 如何使用 SimpleBlobDetector 获取 blob 的额外信息?

    robot sherrick 回答了我这个问题 https stackoverflow com a 13534094 1705967 这是他回答的后续问题 cv SimpleBlobDetectorOpencv 2 4 中的 看起来非常令人
  • 如何使用Java OpenCV

    我正在使用图像处理开始我的最后一年项目 并希望完成类似的事情this http www youtube com watch v EPai5f2sWaA 它是人体和物体检测的结合 我真的很想用 Java 来做 因为我在 C 方面的经验很少 I
  • OpenCV,捕获的视频比原始相机视频运行得更快!

    我正在使用 openCV 从相机捕获视频并将其存储到 avi 文件 问题是当我完成捕获并运行 avi 文件时 视频流看起来速度很快 这是代码 void main CvCapture capture cvCaptureFromCAM 0 in
  • 如何在 opencv 3.0 Beta 中从文件读取 UMat?

    我想用UMat所以我的代码可以使用 OpenCL OpenCV 3 0 0 Beta 在 GPU 和 CPU 上运行 但我找不到将图像文件读入的方法UMat或转换一个Mat to UMat 如何将图像读入UMat 样品用于Mat to UM
  • 使用 SURF 在检测到的对象周围绘制矩形

    我正在尝试从涉及冲浪检测器的以下代码中检测对象 我不想绘制匹配项 我想在检测到的对象周围绘制一个矩形 但不知何故我无法获得正确的单应性 请任何人指出在哪里我走错了 include
  • 警告:发生了非法反射访问操作(java 中的便携式 opencv)

    我想做一个便携的opencv将依赖项添加到 maven 文件的应用程序pom xml 简化的代码是 import org opencv core Mat public class Builder public static void mai
  • VideoCapture 未检测到 uEye 摄像头

    我的 uEye 相机遇到了一个问题 使用我的笔记本电脑摄像头 id 0 或 USB 上的网络摄像头 id 1 此行完美运行 TheVideoCapturer open 1 TheVideoCapturer 属于 VideoCapture 类
  • python openCV 中的人口普查变换

    我开始在一个与立体视觉相关的项目中使用 openCV 和 python 我找到了关于使用 openCV 在 C 中进行人口普查转换的文档页面 link http docs opencv org 3 1 0 d2 d7f namespacec
  • 使用opencv+picamera流IO用树莓派捕获视频

    我使用 Raspberry 来简单地显示一个视频 目前仅此 为此 我必须使用 opencv cv2 我尝试了很多解决方案 但现在我想使用 Picamera 库捕获视频 我将向您展示我的代码 import io import time imp
  • 如何识别与我的对象相关的轮廓并找到它们的几何质心

    问题陈述和背景信息 EDIT 约束 法兰上的红色会随着时间的推移而变化 所以我此时不会尝试使用颜色识别来识别我的对象 除非它足够强大 此外 外部照明也可能是一个因素 因为将来这将是在室外区域 我有 RGB 深度相机 有了它 我就能捕捉到这个
  • 使用 openCV 对图像中的子图像进行通用检测

    免责声明 我是计算机视觉菜鸟 我看过很多关于如何在较大图像中查找特定子图像的堆栈溢出帖子 我的用例有点不同 因为我不希望它是具体的 而且我不确定如何做到这一点 如果可能的话 但我感觉应该如此 我有大量图像数据集 有时 其中一些图像是数据集的
  • OpenCV 中的 Gabor 内核参数

    我必须在我的应用程序中使用 Gabor 过滤器 但我不知道这个 OpenCV 方法参数值 我想对虹膜进行编码 启动 Gabor 过滤器并获取特征 我想对 12 组 Gabor 参数值执行此操作 然后我想计算 Hamming Dystans
  • 计数物体和更好的填充孔的方法

    我是 OpenCV 新手 正在尝试计算物体的数量在图像中 我在使用 MATLAB 图像处理工具箱之前已经完成了此操作 并在 OpenCV Android 中也采用了相同的方法 第一步是将图像转换为灰度 然后对其进行阈值计算 然后计算斑点的数
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查

随机推荐

  • RK平台images打包细则

    IMGs打包细节 平台 RK3288 背景 RK3288编译产生了RK3288MiniLoaderAll V2 19 bin uboot img kernel img uboot img misc img recovery img reso
  • pycharm终端激活环境时报错

    pycharm终端激活环境时报错 nvoke Expression 无法将参数绑定到参数 Command 因为该参数为空字符串 所在位置 E anaconda anaconda anaconda3 envs wsbpytorch shell
  • 启明智显分享

    你现在所看到的是启明智显基于乐鑫ESP32 S3方案推出的4寸RGB接口的86盒开发板 你可以选择应用IDF或arduino进行开发 也可以选择我们提供的开发工具平台8ms上进行开发 为什么会选择8ms平台呢 因为平台已将LVGL作为可选软
  • Java使用FTP上传文件被损坏的问题

    原因 首先 此问题是因为FTP协议定义的数据传输方式有关 当Java FTP客户端使用ASCII传输时会发现有些上传的文件已经被损坏 FTP协议规定了两种传输方式分别是ASCII与binary方式 ASCII 方式 这种机制指 在针对传输内
  • eclipse中开发corba完整说明(jacORB版)

    以下是java eclipse平台上配置并使用jacORB2 3 0开发例子的步骤 0 安装jdk1 6 0 要求 jdk的安装路径里不能包含 空格字符或中文等一些jvm无法识别的字符 配置环境变量JAVA HOME D JavaTool
  • 陆奇如何解构一家企业?

    以下内容来自微信公众号 湖畔大学 ID hupansanbanfu 陆奇博士是整个华人圈中在科技公司做到最高管理职位 视野最宽广的人 也是我最尊重和最认可的科技公司管理者 未来所有企业都要转型成为科技企业 战略 布局和视野将决定每个企业的屋
  • dyld[19592]: Library not loaded: @rpath/SDWebImage.framework/SDWebImage

    SDK开发长见错 Demo中已引入SDWebImage framework 编译也不报错 运行demo的时候直接闪退 报 dyld 19592 Library not loaded rpath SDWebImage framework SD
  • google app engine(webapp2)文件下载

    enroll file enroll mobileconfig filecontent open conf enroll file rb read self response headers add header Content Type
  • Android 安装程序(APK)后并启动程序(APK) 安装 卸载

    Android 安装程序 APK 后并启动程序 APK Intent i new Intent Intent ACTION VIEW i setDataAndType Uri parse file apkfile application v
  • 高效 JavaScript 单元测试

    一个损坏的 JavaScript 代码示例 Web 应用程序面临的一个最大挑战是支持不同版本的 Web 浏览器 能在 Safari 上运行的 JavaScript 代码不一定能在 Windows Internet Explorer IE F
  • ENVI扩展工具——混合像元分解FCLS

    ENVI中线性光谱分离工具 Linear Spectral Unmixing 只有一个约束条件 分解丰度图和为1 但是 会出现负值的情况 理论上来讲 一个像元内每种端元的丰度图DN值范围在0 1之间 并且和为1 这是两个约束条件 因此可以利
  • 牛客网刷题:二叉搜索树的最近公共祖先

    原题链接 本人的思路见下图 代码 class Solution def lowestCommonAncestor self root TreeNode p int q int gt int write code here if p root
  • Python面向对象植物大战僵尸

    先来一波效果图 来看看如何设计游戏架构 import sys import pygame class BaseSprite pygame sprite Sprite def init self name super init self im
  • 七款简单易用的项目管理平台

    TeamLab 它是一个在线商业协作和项目管理的平台 主要功能包括 项目管理 里程碑管理 任务 报表 事件 博客 论坛 书签 Wiki 即时消息等 TeamLab是专为中小型企业 团队打造的系统 使用SaaS解决方案的网站 也就是说 您可以
  • 【持续更新之】CSS小技能

    empty 伪类 匹配空标签元素 例如 div class cs div cs empty width 120px height 120px border 10px dashed 此时 div元素就会匹配 empty伪类 用法 隐藏空元素
  • Aircrack-ng设置监听模式异常

    Aircrack ng设置监听模式异常 aircrack ng 在某些情况下 用户使用Aircrack ng工具集中的airmon ng命令 将无线网卡设置为监听模式时 会出现异常 如SIOCSIFFLA65 Name not unique
  • fiddler中设置Before断点修改请求

    Fiddler最强大的功能莫过于设置断点了 设置好断点后 你可以修改httpRequest的任何信息包括host cookie或者表单中的数据 设置断点有两种方法 第一种 打开Fiddler 点击Rules gt Automatic Bre
  • 一文搞懂MySQL架构设计,再也不用担心面试官问得太深

    很多开发同学对SQL优化如数家珍 却对MySQL架构一知半解 岂不是只见树叶 不见森林 终将陷入细节中不能自拔 今天就一块学习MySQL分层架构 深入了解MySQL底层实现原理 以及每层的作用 我们常见的SQL优化到底在哪一层做了优化 1
  • 西门子PLC1500大型程序fanuc机器人汽车焊装

    西门子PLC1500大型程序fanuc机器人汽车焊装 包括1台西门子1500PLC程序 2台触摸屏TP1500程序 9个智能远程终端ET200SP Profinet连接 15个Festo智能模块Profinet通讯 10台Fanuc发那科机
  • Python OpenCV学习总结Day 3.1 图像处理(上篇) 颜色处理与二值化,滤波去噪,形态学腐蚀膨胀,边缘检测

    目录 前言 Day3 1 OpenCV图像处理核心技术 上篇 颜色处理与二值化 颜色空间转换 阈值二值化 颜色阈值筛选 滤波去噪 形态学操作 腐蚀膨胀 开运算与闭运算 边缘检测 Sobel算子 Roberts算子 Prewitt算子 Can