基于opencv-python的二值图像处理

news2024/11/20 21:21:10

目录

阈值

腐蚀与膨胀

开运算与闭运算

连通区域分析

轮廓


一、阈值

按照颜色对图像进行分类,可以分为彩色图像、灰度图像和二值图像。灰度图像是只含亮度信息,不含色彩信息的图像。灰度化处理是把彩色图像转换为灰度图像的过程,是图像处理中的基本操作。OpenCV 中彩色图像使用 BGR 格式。灰度图像中用 8bit 数字 0~255 表示灰度,如:0 表示纯黑,255 表示纯白。彩色图像进行灰度化处理,可以在读取图像文件时直接读取为灰度图像,也可以通过函数 cv.cvtColor() 将彩色图像转换为灰度图像。一下是简答的图像灰度化处理代码:

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)

二、腐蚀与膨胀

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

  • 原图
  • 原图经过腐蚀得到的图
  • 原图经过膨胀得到的图

参考代码如下:

import numpy as np
import cv2

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

    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()

 三、开运算与闭运算

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

import numpy as np
import cv2

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

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()

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

import numpy as np
import cv2

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

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()

  四、连通区域分析

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)

    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)

    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)

五、连通区域分析

轮廓是由连续的点组成的曲线。轮廓与边缘很相似,但轮廓是连续的,边缘不一定都连续。

轮廓反映了物体的基本外形,常用于形状分析和物体的检测和识别。

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)
                                                                                              
    image, 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/454483.html

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

相关文章

【Linux】popen pclose接口介绍

本篇文章简单讲述了c语言接口popen/pclose的用法 1.函数作用 函数定义如下 #include <stdio.h>FILE *popen(const char *command, const char *type); int pclose(FILE *stream);1.1 popen popen函数会创建一个管道&#xff0c;fork后调用shell来打开进程。由于管道的…

Junit 5 如何使用 Guice DI

Guice 是一个依赖注入的小清新工具。 相比 Spring 的依赖管理来说&#xff0c;这个工具更加小巧&#xff0c;我们可以在测试中直接使用。 Junit 5 在 Junit 中使用就没有那么方便了&#xff0c;因为 Junit 没有 Guice 的注解。 你需要手动写一个类&#xff0c;在这个类中&a…

SpringCloud入门实战(七)-Hystrix服务熔断

&#x1f4dd; 学技术、更要掌握学习的方法&#xff0c;一起学习&#xff0c;让进步发生 &#x1f469;&#x1f3fb; 作者&#xff1a;一只IT攻城狮 。 &#x1f490;学习建议&#xff1a;1、养成习惯&#xff0c;学习java的任何一个技术&#xff0c;都可以先去官网先看看&…

Spring的作用域与生命周期

文章目录 一、lombok的安装与使用二、Spring作用域二、Bean原理分析执行流程Bean的生命周期 一、lombok的安装与使用 lombok插件可以提供给我们一些注释&#xff0c;这些注释可以很好的帮助我们消除Java代码中大量冗余的代码&#xff0c;可以使得我们的Java类可以看起来非常的…

OpenCV实战——二值特征描述符

OpenCV实战——二值特征描述符 0. 前言1. ORB 和 BRISK 二值描述符1. ORB 特征描述符1.2 ORB 与 BRISK 算法 2. FREAK 二值描述符3. 二值描述符采样模式4. 完整代码相关链接 0. 前言 在《特征描述符》一节中&#xff0c;我们学习了如何使用从图像强度梯度中提取的描述符来描述…

ChatGPT使用学习(一):chatgpt_academic安装到测试详细教程(一文包会)

ChatGPT 1.简介及功能2.前置准备3.开始使用 1.简介及功能 Chargpt academic是一种基于OpenAI GPT模型的语言生成模型&#xff0c;它是专门为学术研究者和学生设计的。它使用预训练模型来生成与学术论文、文章和文献相关的文本&#xff0c;可以用于自然语言处理、机器翻译、文本…

SpringBoot整合Redis,一篇带你入门使用Redis

本文介绍如何将Redis整合到SpringBoot项目中&#xff0c;以及如何配置、封装和使用 文章目录 前言环境搭建项目结构添加依赖 Module封装RedisConfig配置封装常见操作为ServiceRedisServiceRedisLockUtil 测试 前言 参考链接&#xff1a; 英文官网链接中文官网链接Redis githu…

vue项目使用RSA加解密

vue项目使用RSA加解密 1.安装2.在utils下创建rsa.js3.在main.js中引入4.页面调用5.遇到的问题 1.安装 使用一下命令安装jsencrypt插件 npm install jsencrypt --save-dev npm i encryptlong -S注意&#xff1a; &#xff08;1&#xff09;上述插件不支持在小程序中使用&#…

python大数据作业-客户价值分析-实训头歌

一、实验目的与要求 1、掌握使用numpy和pandas库处理数据的基本方法。 2、掌握使用RFM分析模型对客户信息进行特征提取的基本方法。 3、掌握对特征数据进行标准化处理的基本方法。 4、掌握使用Sklearn库对K-Means聚类算法的实现及其评价方法。 5、掌握使用matplotlib结合panda…

【2】YOLOv8原理解析:重新定义实时目标检测的速度和精度

文章目录 0.前言1.YOLOv51.1 YOLOv5网络回顾1.2 YOLOv5网络结构图 2.YOLOv82.1 YOLOv8概述2.2 YOLOv8整体结构图2.3 YOLOv8yaml 文件与 YOLOv5yaml 文件对比2.3.1 参数部分2.3.2 主干部分2.3.3 Neck部分2.3.4 Head部分 2.4 正负样本分配策略2.4.1 静态分配策略和动态分配策略有…

机器学习实战:Python基于SVD奇异值分解进行矩阵分解(八)

文章目录 1 前言1.1 奇异值分解1.2 奇异值分解的应用 2 简单计算SVD2.1 NumPy 计算 SVD2.2 scikit-learn 计算截断 SVD2.3 scikit-learn 计算随机 SVD 3 demo数据演示3.1 导入函数3.2 导入数据3.3 计算SVD 4 讨论 1 前言 1.1 奇异值分解 奇异值分解&#xff08;Singular Valu…

【李老师云计算】实验二:Spark集群的搭建与求解最大值

索引 前言1. Spark部署1.1 下载Spark1.2 解压Spark1.3 修改环境变量1.4 修改主机Spark配置文件1.4.1 slaves.template文件配置1.4.2 spark-env.sh.template文件配置 1.5 分享主机Spark到从机1.6 启动Spark集群(★重启后的操作)1.7 通过jps查看是否启动成功1.8 通过网页查看是否…

Vue+Echarts 项目演练(上)整体页面结构的构建

项目分辨率响应式创建 项目顶部信息条创建 页面主体创建 接项目搭建与初始化之后继续对项目进行部署工作 项目展示&#xff1a; 技术栈&#xff1a; 1. vue3.0vue-router4.0axios 2. flex 布局 3. LESS 4. rem 屏幕适配 5. echarts5.0 项目分辨率响应式创建 对插件…

centos 8 配置LVS+ keepalived 高可用

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a;小刘主页 ♥️每天分享云计算网络运维课堂笔记&#xff0c;努力不一定有收获&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的绽放&#xff0…

3105—IIS部署

一、部署子站点 1—父站点web.config配置 新增并设定location段落 <configuration><location path"." allowOverride"false" inheritInChildApplications"false"><system.webServer><handlers><add name"aspNe…

【Matlab】基于紧格式动态线性化的无模型自适应控制

例题来源&#xff1a;侯忠生教授的《无模型自适应控制&#xff1a;理论与应用》&#xff08;2013年科学出版社&#xff09;。 对应书本 4.2 单输入单输出系统(SISO)紧格式动态线性化(CFDL)的无模型自适应控制(MFAC) 例题4.1 题目要求 matlab代码 clc; clear all;%% 期望轨迹…

neo4j jdk安装版本搭配

jdk下载版本为jdk11 neo4j 为neo4j-community-4.3.15 可使用 非常流畅 没有毛病&#xff01;&#xff01;&#xff01; 这里直接给出结论&#xff0c;对于想知道这两个版本为什么适配的小伙伴可以继续往下看 出现这个界面后在网页打开browser 输入账号和密码后就可以登录了&…

【架构设计】什么是CAP理论?

1、理论 CAP理论是指计算机分布式系统的三个核心特性&#xff1a;一致性&#xff08;Consistency&#xff09;、可用性&#xff08;Availability&#xff09;和分区容错性&#xff08;Partition Tolerance&#xff09;。 在CAP理论中&#xff0c;一致性指的是多个节点上的数据…

Vector - CAPL - CANoe硬件配置函数 - 01

CAN ACK自应答 在测试CAN&CANFD通信或者网络管理的时候&#xff0c;我们经常遇到使用报文&#xff08;网络管理报文或者通信报文&#xff09;唤醒被测件这个测试点&#xff0c;如果测试比较多的情况下&#xff0c;我们就会发现&#xff0c;如果CANoe没有接被测件或者被测件…

Python标准数据类型-Number(数字)

✅作者简介&#xff1a;CSDN内容合伙人、阿里云专家博主、51CTO专家博主、新星计划第三季python赛道Top1 &#x1f4c3;个人主页&#xff1a;hacker707的csdn博客 &#x1f525;系列专栏&#xff1a;零基础入门篇 &#x1f4ac;个人格言&#xff1a;不断的翻越一座又一座的高山…