【OpenCV技能树】——二值图像处理

news2024/10/2 8:24:57

前言

😊😊😊欢迎来到本博客😊😊😊

  目前正在进行 OpenCV技能树的学习,OpenCV是学习图像处理理论知识比较好的一个途径,至少比看书本来得实在。本专栏文章主要记录学习OpenCV的过程以及对学习过程的一些反馈记录。感兴趣的同学可以一起学习、一起交流、一起进步。🌟🌟🌟

  下面框架图主要是OpenCV入门技能树总共有27个知识点,其中包括了8个大章的学习内容,如果感兴趣的可以进一步学习博主写的关于OpenCV的专栏【通俗易懂OpenCV(C++版)详细教程】:

在这里插入图片描述

🎁🎁🎁支持:如果觉得博主的文章还不错或者您用得到的话,可以悄悄关注一下博主哈,如果三连收藏支持就更好啦!这就是给予我最大的支持!😙😙😙


文章目录

      • 三、二值图像处理
        • 3.1 阈值
        • 3.2 腐蚀与膨胀
        • 3.3 开运算与闭运算
        • 3.4 连通区域分析
        • 3.5 轮廓

三、二值图像处理

3.1 阈值

  题目:图像的灰度化处理

按照颜色对图像进行分类,可以分为:彩色图像、灰度图像和二值图像。
灰度图像是只含亮度信息,不含色彩信息的图像。
灰度化处理是把彩色图像转换为灰度图像的过程,是图像处理中的基本操作。
OpenCV中彩色图像使用 BGR 格式。灰度图像中用 8bit 数字 0~255 表示灰度,如:0 表示纯黑,255 表示纯白。

彩色图像进行灰度化处理,可以在读取图像文件时直接读取为灰度图像,也可以通过函数 cv.cvtColor() 将彩色图像转换为灰度图像。

以下图像灰度化程序中,能够正确执行图像灰度化操作的是?

   解析:

方法一:imread时直接转灰度
cv.imread("GrayscaleLena.tif", cv.IMREAD_GRAYSCALE);
方法二: 用cvtColor
img = cv.imread("GrayscaleLena.tif")
imgGray =  cv.cvtColor(img, cv.COLOR_BGR2GRAY)
import cv2 as cv
if __name__ == '__main__':
    img = cv.imread("GrayscaleLena.tif")
    imgGray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    cv.imshow("ImgGray", imgGray)
    key = cv.waitKey(0)

3.2 腐蚀与膨胀

  题目:普通鸬鹚不普通

OpenCV的膨胀与腐蚀,让“普通鸬鹚”不普通,下图从左到右分别是:
	原图
	原图经过腐蚀得到的图
	原图经过膨胀得到的图

   解析:

import numpy as np
import cv2

if __name__ == '__main__':
    img_origin = cv2.imread('bird.jpeg', cv2.COLOR_BGR2LAB)//BGR颜色空间与CIE Lab颜色空间之间的相互转换

    kernel = np.ones((3, 3), np.uint8)//卷积核
    img_erosion = cv2.erode(img_origin, kernel, iterations=1)//腐蚀  注意参数顺序 卷积核参数在第二个参数处
    img_dilation = cv2.dilate(img_origin, kernel, iterations=1)//膨胀  注意卷积核参数在第二个参数处

    img_all = np.concatenate((img_origin, img_erosion, img_dilation), axis=1)//三幅图像合成成一张图像
    cv2.imshow('img: origin, erosion and dilation', img_all)

    cv2.waitKey(0)
    cv2.destroyAllWindows()

3.3 开运算与闭运算

  题目:小鸊鷉橡皮擦(I)

OpenCV 里先腐蚀再膨胀操作叫做“开运算”。
小鸊鷉(pi ti)的名片被小朋友画了几笔,尝试通过先腐蚀再膨胀修复,效果不明显

框架代码如下,给出开运算函数def open_op(img)

import numpy as np
import cv2

def open_op(img):
    # TODO(You): 请在此实现代码

if __name__ == '__main__':
    img_origin = cv2.imread('bird.png', cv2.COLOR_BGR2LAB)

    img_opened = open_op(img_origin)

    img_all = np.concatenate((img_origin, img_opened), axis=1)
    cv2.imwrite('img_opened.jpeg', img_all)
    cv2.imshow('img: origin, erosion and dilation', img_all)

    cv2.waitKey(0)
    cv2.destroyAllWindows()

   解析:

def open_op(img):
    kernel = np.ones((3, 3), np.uint8))//卷积核,是下列两个函数的第二个参数
    img1 = cv2.erode(img, kernel, iterations=1)//对img图像进行腐蚀,得到img1
    img2 = cv2.dilate(img1, kernel, iterations=1)//对img1进行膨胀,得到img2
                                                 
    return img2//整个函数应该返回img2

  
  
  题目:小鸊鷉橡皮擦(II)

OpenCV 里先膨胀再腐蚀操作叫做“闭运算”。
小鸊鷉(pi ti)的名片被小朋友画了几笔,尝试通过先膨胀再腐蚀修复,完成任务

框架代码如下,给出开运算函数def close_op(img):

import numpy as np
import cv2

def close_op(img):
    # TODO(You): 请在此实现代码

if __name__ == '__main__':
    img_origin = cv2.imread('bird.png', cv2.COLOR_BGR2LAB)

    img_closed = close_op(img_origin)

    img_all = np.concatenate((img_origin, img_opened), axis=1)
    cv2.imwrite('img_opened.jpeg', img_all)
    cv2.imshow('img: origin, erosion and dilation', img_all)

    cv2.waitKey(0)
    cv2.destroyAllWindows()

   解析:

def close_op(img):
    kernel = np.ones((3, 3), np.uint8)//卷积核,是下列两个函数的第二个参数
    img1 = cv2.dilate(img, kernel, iterations=1)//对img进行膨胀,得到img1                                              
    img2 = cv2.erode(img1, kernel, iterations=1)//对img1图像进行腐蚀,得到img2
    return img2//整个函数应该返回img2

3.4 连通区域分析

  题目:框住水鸭子

  OpenCV 里的连通区域分析可以将具有相同像素值且位置相邻的前景像素点组成的图像区域识别出来。有两种像素相邻的定义:

通过OpenCV的连通区域分析算法,我们可以将下图的水鸭子的外框框出来:

框架代码如下:

import cv2
import numpy as np
import matplotlib.pyplot as plt

def close_op(img):
    kernel = np.ones((3, 3), np.uint8)
    img1 = cv2.dilate(img, kernel, iterations=1)
    img2 = cv2.erode(img1, kernel, iterations=1)
    return img2

def show_images(images):
    i = 0
    for title in images:
        plt.subplot(2, 3, i+1), plt.imshow(images[title], 'gray')
        plt.title(title)
        plt.xticks([]), plt.yticks([])
        i += 1
    plt.show()

if __name__ == '__main__':
    duck_origin = cv2.imread('duck.jpeg', -1)

    duck_box = duck_origin.copy()
    duck_gray = cv2.cvtColor(duck_box, cv2.COLOR_BGR2GRAY)
    duck_gray_with_closed = close_op(duck_gray)
    ret, duck_binary = cv2.threshold(duck_gray_with_closed, 127, 255, cv2.THRESH_BINARY)

    # TODO(You): 请实现识别鸭子区域并用框出来的代码

    images = {
        'duck_origin': duck_origin,
        'duck_gray': duck_gray,
        'duck_gray_with_closed_op': duck_gray_with_closed,
        'duck_binary': duck_binary,
        'duck_box': duck_box
    }
    show_images(images)

   解析:

ret, labels, stats, centroid = cv2.connectedComponentsWithStats(duck_binary)
duck_area = sorted(stats, key=lambda s: s[-1], reverse=False)[-2]
cv2.rectangle(
duck_box,
(duck_area[0], duck_area[1]),
(duck_area[0] + duck_area[2], duck_area[1] + duck_area[3]),
(255, 0, 0),
3)
connectedComponentsWithStats函数介绍
num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(image, connectivity=8, ltype=None)

参数介绍如下:
image:也就是输入图像,必须是二值图,即8位单通道图像。(因此输入图像必须先进行二值化处理才能被这个函数接受)
connectivity:可选值为48,也就是使用4连通还是8连通。
ltype:输出图像标记的类型,目前支持CV_32S 和 CV_16U。 

返回值:
num_labels:所有连通域的数目
labels:图像上每一像素的标记,用数字123…表示(不同的数字表示不同的连通域)
stats:每一个标记的统计信息,是一个5列的矩阵,每一行对应每个连通区域的外接矩形的x、y、width、height和面积,示例如下: 0 0 720 720 291805
centroids:连通域的中心点

3.5 轮廓

  题目:寻找图像的轮廓

轮廓是由连续的点组成的曲线。轮廓与边缘很相似,但轮廓是连续的,边缘不一定都连续。
轮廓反映了物体的基本外形,常用于形状分析和物体的检测和识别。
OpenCV 提供函数 cv.findContours() 对二值图像寻找轮廓,函数 cv2.drawContours() 绘制轮廓。

函数说明:

cv.findContours(image, mode, method[, contours[, hierarchy[, offset]]]	) → contours, hierarchy
我们从康熙御笔书法中提取轮廓,据说这是一种经典的书画复制技法。
下图从上到下分别是: * 康熙御笔原图 * 康熙御笔碑帖图 * 康熙御笔轮廓图

   解析:


import cv2 as cv
 
if __name__ == '__main__':
    img = cv.imread("Contours.jpg", flags=1)
    imgGray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
 
    ret, thresh = cv.threshold(imgGray, 127, 255, cv.THRESH_BINARY_INV)
    contours, hierarchy = cv.findContours(thresh, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)
    contourPic = cv.drawContours(img, contours, -1, (0, 0, 255), 2)
 
    cv.imshow("ContourPicture", contourPic)
    cv.waitKey(0)

🚶🚶🚶 今天的文章就到这里啦~
喜欢的话,点赞👍、收藏⭐️、关注💟哦 ~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/437340.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SDUT操作系统课程(CATS)专题二+专题四(参考总结)

专题二+进程调度算法 RR q=1(含做题代码) 总结:到达时间一到对应进程进入,执行队首进程一次,对应的服务时间划一记号(推荐用正字),队首进程未执行到完成的话重新进入队尾,队首进程执行到完成的话出队,下一秒继续执行队首进程,当5个进程全部入队之后只要执行后两步操…

STM32-互补输出带死区和刹车断路笔记

互补输出带死区控制 比如说,高级控制定时器(TIM1 和 TIM8)可以输出两路互补信号,并管理输出的关断与接通瞬间。这段时间通常称为死区,由于硬件设备的延迟和一些设备转换的用时,这时候进行操作可能会导致比…

如何把Spring Boot的Jar包做成exe?生成自己的程序,超详细教程奉上

近期做了一个前后端合并的spring boot项目,但是要求达成exe文件,提供给不懂电脑的小白安装使用,就去研究了半天,踩了很多坑,写这篇文章,是想看到这篇文章的人,按照我的步骤走,能少踩…

神马转债,海顺转债,柳工转2,能辉转债上市价格预测

神马转债 基本信息 转债名称:神马转债,评级:AAA,发行规模:30.0亿元。 正股名称:神马股份,今日收盘价:7.83元,转股价格:8.38元。 当前转股价值 转债面值 / 转…

【cpolar 内网穿透】Openwrt 软路由实现内网穿透

cpolar 是一种安全的内网穿透云服务,它将内网下的本地服务器通过安全隧道暴露至公网。使得公网用户可以正常访问内网服务。 文章目录 前言一、上传 cpolar 安装包二、配置cpolar环境变量三、安装并配置 cpolar 服务3.1 安装 cpolar3.2 启动 cpolar3.3 进行其他配置 …

RabbitMQ (HelloWord 消息应答 持久化 不公平分发 预取值)

文章目录 HelloWord工作队列工作线程代码启动两个工作线程工作队列(生产者代码)工作队列(结果成功) 消息应答自动应答手动消息应答multiple的解释消息自动重新入队手动应答代码消息手动应答(生产者)消息手动…

网络编程之TCP

hi,大家好,今天为大家带来TCP协议的相关知识 这里写目录标题 认识TCP的相关方法实现TCP版本的回显服务器实现多线程版本的TCP回显服务器实现线程池版本的TCP回显服务器 认识TCP方法 认识TCP的相关方法 实现TCP版本的回显服务器 实现多线程版本的TCP回显服务器 实现线程池版…

尚硅谷大数据技术Hadoop教程-笔记06【Hadoop-生产调优手册】

视频地址:尚硅谷大数据Hadoop教程(Hadoop 3.x安装搭建到集群调优) 尚硅谷大数据技术Hadoop教程-笔记01【大数据概论】尚硅谷大数据技术Hadoop教程-笔记02【Hadoop-入门】尚硅谷大数据技术Hadoop教程-笔记03【Hadoop-HDFS】尚硅谷大数据技术Ha…

轻松管理和保障容器应用程序:Docker Swarm安全之道

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 文章目录 一、 介绍Docker Swarm 安全1. 什么是Docker Swarm2. 为什么要使用Docker Swarm3. Docker Swarm的安全特性 二…

sql语法:详解DDL

Mysql版本:8.0.26 可视化客户端:sql yog 目录 一、DDL是什么?二、和数据库相关的DDL2.1 创建数据库2.2 删除数据库2.3 查看所有的数据库,当前用户登录后,可以看到哪些数据库2.4 查看某个数据库的详细定义2.5 修改数据库…

你一定能看懂的数据库事务和事务特性实现原理

一。概念 事务 是数据库执行原子操作的基本单位。一个事务中的多个修改,则要么全部成功执行,要么全部不执行。 关于事务的 MYSQL 官网的解释 Transactions are atomic units of work that can be *committed* or *rolled back*. When a transaction ma…

PyTorch 深度学习实战 | DIEN 模拟兴趣演化的序列网络

01、实例:DIEN 模拟兴趣演化的序列网络 深度兴趣演化网络(Deep Interest Evolution Network,DIEN)是阿里巴巴团队在2018年推出的另一力作,比DIN 多了一个Evolution,即演化的概念。 在DIEN 模型结构上比DIN 复杂许多,但大家丝毫不用担心,我们将DIEN 拆解开来详细地说…

Unity+jenkins自动化打包(1)

一 安装Jenkins https://www.jenkins.io/download/ 官网 1) 使用 brew 安装 2) 安装完成后一般都会遇到问题 我用的是jenkins-lts 稳定版 解决办法 删除掉对应的文件夹 1 rm -rf /usr/local/Homebrew/Library/Taps/homebrew/homebrew-services 2…

内网穿透实现在外远程SQL Server数据库 - Windows环境

目录 前言 1. 本地安装配置SQL Server 2. 将本地sqlserver服务暴露至公网 2.1 本地安装cpolar内网穿透 2.2 创建隧道 3. 公网远程连接sqlserver 3.1 使用命令行远程连接sqlserver, 3.2 使用图形界面远程连接sqlserver 3.3 使用SSMS图形界面远程连接sqlserver 4. 配置…

【服务器】威联通NAS文件共享 - 搭建SFTP服务并内网穿透实现在外远程访问

Yan-英杰的主页 悟已往之不谏 知来者之可追 C程序员,2024届电子信息研究生 目录 前言 1. 威联通NAS启用SFTP 2. 测试局域网访问 3. 内网穿透 3.1 威联通安装cpolar内网穿透 3.2 创建隧道 3.3 测试公网远程访问 4. 配置固定公网TCP端口地址 4.1 保留一个固定TCP…

AI绘图设计师Stable Diffusion成为生产力工具(六):制作一张庆祝五一劳动节的海报

S:AI能取代设计师么? I :至少在设计行业,目前AI扮演的主要角色还是超级工具,要顶替?除非甲方对设计效果无所畏惧~~ 预先学习: 安装webui《Windows安装Stable Diffusion WebUI及问题解决记录》。…

Spring《二》bean的实例化与生命周期

🍎道阻且长,行则将至。🍓 上一篇:Spring《一》快速入门 下一篇:Spring《三》DI依赖注入 目录 一、bean实例化🍍1.构造方法 ***2.静态工厂 *使用工厂创建对象实例化bean 3.实例工厂 ***使用示例工厂创建对象…

深度学习必备书籍——《Python深度学习 基于Pytorch》

作为一名机器学习|深度学习的博主,想和大家分享几本深度学习的书籍,让大家更快的入手深度学习,成为AI达人!今天给大家介绍的是:《Python深度学习 基于Pytorch》 文章目录 一、背景二、内容简介三、新版特色四、作者介绍…

3.26学习周报

文章目录 前言文献阅读摘要简介方法结果讨论结论 时间序列预测学习1.基础知识1.1什么是时间序列?1.2时间序列的基本任务?2.时间序列预测算法汇总LSTM学习 总结 前言 本周阅读文献《Simulate the forecast capacity of a complicated water quality mode…

【SpringBoot】| 邮箱发送验证码,你会了吗?

目录 🦁 题外话🦁 提前准备2.1 配置邮箱第三方登录2.1.1 点击设置——账户2.1.2 开启POP3/SMTP服务 2.2 添加依赖2.3 yaml配置 🦁 进入主题🦁 测试使用🦁 尾声3.1 安利一个生成验证码的工具类3.1.1 添加依赖3.1.2 编写…