OpenCV常用功能——灰度处理和图像二值化处理

文章目录

  • 一、灰度处理
      • 1.1 cvtColor函数
  • 二、图像二值化处理
      • 2.1 全局阈值
      • 2.2 自适应阈值

一、灰度处理

1.1 cvtColor函数

函数原型:

cv2.cvtColor(src, code[, dst[, dstCn]]) -> dst

功能:转换图像颜色空间。
参数

  • src: 输入图像。
  • code: 颜色空间转换代码。可以取常量cv2.COLOR_BGR2GRAY或cv2.COLOR_RGB2GRAY。
  • dst: 输出图像。
  • dstCn: 输出图像的通道数,如果设置为0,则跟随转换代码自动设置。

内置函数示例代码:

import cv2
img = cv2.imread("color.jpg")
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)cv2.imshow("Gray", img_gray)
cv2.waitKey(0)
cv2.destroyAllWindows()

灰度处理的原理是将彩色图像转换成灰度图像,通常使用的方法是将彩色图像的RGB三个通道的值加权平均,得到一个灰度值,再用这个灰度值代替RGB三个通道的值,从而得到灰度图像。常用的加权平均公式是:
g r a y = 0.299 × R + 0.587 × G + 0.114 × B gray = 0.299 \times R + 0.587 \times G + 0.114 \times B gray=0.299×R+0.587×G+0.114×B
其中, R 、 G 、 B R、G、B RGB分别是彩色图像的红、绿、蓝通道的值, 0.299 、 0.587 、 0.114 0.299、0.587、0.114 0.2990.5870.114是加权系数,这些系数是心理物理学中根据人眼对不同颜色敏感度的实验结果得出的。这个公式也称为亮度加权法,能够比较好地保留彩色图像的明暗对比度。

通过原理实现灰度处理代码:

import cv2
img = cv2.imread('lean.jpg')
img = cv2.resize(img, (240, 240), interpolation=cv2.INTER_CUBIC)
height, width = img.shape[:2]
gray = np.zeros((height, width, 1), dtype="uint8")
for i in range(height):for j in range(width):gray[i][j] = img[i][j][0] * 0.114 + img[i][j][1] * 0.587 + img[i][j][2] * 0.299  # 加权值法# gray[i][j] = (img[i][j][0] +img[i][j][1]+img[i][j][2])/3#平均值法# gray[i][j] = max(img[i][j][0],img[i][j][1],img[i][j][2]) #最大值法cv2.imshow("Gray", gray)
cv2.waitKey(0)
cv2.destroyAllWindows()

上述代码逐个像素点计算灰度值,然后用灰度值代替RGB三个通道的值,得到灰度图像并显示出来。值得注意的是,这种方法虽然简单易懂,但计算每个像素点的灰度值,效率较低,不适用于处理较大的图像。在实际中,我们可以使用OpenCV提供的函数来实现灰度处理,以提高程序的执行效率。

注意:灰度图像在Python中数据类型是numpy的uint8类型,即8位无符号整型。

二、图像二值化处理

图像二值化处理是将灰度图像上的像素点转化为黑白两种颜色的处理方法。其原理是将灰度图像的像素值按一定的阈值进行分割,大于等于阈值的像素值设为一个值(通常是255),小于阈值的像素值设为另一个值(通常是0)。这样得到的图像就只有黑白两种颜色,便于进行一些形态学处理和特征提取。

图像二值化有两种方法:全局阈值和自适应阈值全局阈值是指将整个图像的像素值都按照同一个阈值进行分割,而自适应阈值则是将图像分割成若干个小块,然后对每个小块单独计算阈值,从而得到更准确的分割结果。下面分别介绍这两种方法的实现方式。

2.1 全局阈值

在OpenCV中,使用cv2.threshold()函数可以实现全局阈值二值化。函数原型如下:

retval, dst = cv2.threshold(src, thresh, maxval, type)

参数说明:

  • src为输入图像,必须为灰度图。
  • dst为输出图像,尺寸和类型与原图像相同。
  • thresh为设定的阈值。
  • maxval为最大值,当像素值大于阈值时,赋值为maxval。
  • type为阈值处理的类型,包括以下几种类型:
    • cv2.THRESH_BINARY:二值化,当像素值大于阈值时,赋值为maxval,否则赋值为0。
    • cv2.THRESH_BINARY_INV:反二值化,当像素值大于阈值时,赋值为0,否则赋值为maxval。
    • cv2.THRESH_TRUNC:截断,当像素值大于阈值时,赋值为阈值,否则不变。
    • cv2.THRESH_TOZERO:阈值以下归零,当像素值小于阈值时,置为0,否则不变。
    • cv2.THRESH_TOZERO_INV:阈值以上归零,当像素值大于阈值时,置为0,否则不变。

示例代码如下:

import cv2# 加载灰度图
img_gray = cv2.imread('lena_gray.jpg', 0)# 全局阈值二值化
retval, img_binary = cv2.threshold(img_gray, 128, 255, cv2.THRESH_BINARY)# 显示图像
cv2.imshow('original', img_gray)
cv2.imshow('binary', img_binary)
cv2.waitKey()
cv2.destroyAllWindows()

其中,使用cv2.imread()加载灰度图时,第二个参数必须设置为0,表示加载灰度图。

2.2 自适应阈值

在OpenCV中,使用cv2.adaptiveThreshold()函数可以实现自适应阈值二值化。函数原型和前面的cv2.threshold()函数类似,但多了两个参数:

dst = cv2.adaptiveThreshold(src, maxval, adaptiveMethod, thresholdType, blockSize, C)

参数说明:

  • src为输入图像,必须为灰度图。
  • maxValue为最大值,当像素值大于阈值时,赋值为maxValue。
  • adaptiveMethod为自适应阈值算法类型,包括以下两种类型:
    • cv2.ADAPTIVE_THRESH_MEAN_C:计算每个小区域的平均灰度值作为阈值。
    • cv2.ADAPTIVE_THRESH_GAUSSIAN_C:计算每个小区域的高斯加权平均灰度值作为阈值。
  • thresholdType为阈值处理的类型,同全局阈值二值化函数。
  • blockSize为块大小,要求为奇数,代表自适应阈值计算时使用的小区域大小。
  • C为常数,阈值减小的常数。
    实例代码如下:
import cv2# 加载灰度图
img_gray = cv2.imread('lena_gray.jpg', 0)# 自适应阈值二值化
img_binary = cv2.adaptiveThreshold(img_gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 127, 1)# 显示图像
cv2.imshow('original', img_gray)
cv2.imshow('binary', img_binary)
cv2.waitKey()
cv2.destroyAllWindows()

其中,使用cv2.ADAPTIVE_THRESH_MEAN_C作为自适应阈值算法,计算每个小块的平均值;使用cv2.THRESH_BINARY作为阈值处理的类型。阈值大小由blockSizeC两个参数共同决定,可以通过调整这两个参数来得到更适合的分割效果。

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

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

相关文章

python之计算平面点集的的面积

在当今数据驱动的世界中,计算平面点集的最小外接轮廓面积被广泛应用于各种实际场景中。它是一项重要而魅力十足的任务,旨在找到一个最小的矩形或多边形区域,能够完全包围给定的离散点集。这个看似简单的问题背后隐藏着许多挑战,需…

轻量封装WebGPU渲染系统示例<7>-材质多pass(源码)

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/version-1.01/src/voxgpu/sample/MultiMaterialPass.ts 此示例渲染系统实现的特性: 1. 用户态与系统态隔离。 2. 高频调用与低频调用隔离。 3. 面向用户的易用性封装。 4. 渲染数据和渲染机制分离。 …

qt开源版和企业版下载

企业版可以在官网下载 没有licence qmake无法编译提示QT License check failed! Giving up… Qt5\5.15.1\msvc2019_64\mkspecs\qconfig.pri把这个文件中的倒数第二行liccheck.exe这几个字符删掉就可以 开源版需要使用下载器下载 详解QT6.5在线下载—使用国内镜像_qt镜像下载…

SpringBoot拉取高德天气预报数据

SpringBoot拉取高德天气预报数据 一、账号申请 1.整体流程 天气文档:https://lbs.amap.com/api/webservice/guide/api/weatherinfo 整体流程可参考:https://lbs.amap.com/api/webservice/guide/create-project/get-key 2.注册账号 注册地址&#x…

华为机试题:HJ7 取近似值

目录 第一章、算法题1.1)题目描述1.2)第一种解题思路与答案1.3)第二种解题思路与答案1.4)牛客链接 友情提醒: 先看文章目录,大致了解文章知识点结构,点击文章目录可直接跳转到文章指定位置。 第一章、算法…

git建仓库小记

git建仓库小记 1.新建远端git仓库2.新建本地仓库3.添加ssh key4.将本地仓库关联到远端5.push & pull 每次新建git项目的时候都要翻翻之前收藏的几篇帖子,索性自己汇总一下记录,以后一次粘贴搞定。 1.新建远端git仓库 这个比较简单,网页…

腾讯云轻量应用服务器地域怎么选择比较好?

腾讯云轻量应用服务器地域怎么选比较好?腾讯云轻量应用服务器地域是指轻量服务器数据中心所在的地理位置,如上海、广州和北京等地域,如何选择地域?腾讯云百科txybk.com关于地域的选择建议就近原则,用户距离轻量服务器地域越近&am…

Python Wordcloud报错:Only supported for TrueType fonts,多种解决方案

Python Wordcloud报错:Only supported for TrueType fonts,多种解决方案。 报错内容如下: 2023-10-26T09:35:41.190459839Z Traceback (most recent call last): 2023-10-26T09:35:41.190502589Z File “lib/task/compute.py”, line 621, i…

腾讯云国际-如何使用对象存储COS在 CKafka 控制台创建数据异步拉取任务?腾讯云代充

操作场景 Datahub 支持接入各种数据源产生的不同类型的数据,统一管理,再分发给下游的离线/在线处理平台,构建清晰的数据通道。 本文以 COS 数据为例介绍如何在 CKafka 控制台创建数据异步拉取任务,并对任务进行修改配置&#xf…

leetcode_98复原IP地址

1. 题意 给一个只包含数字的字符串&#xff0c;将它还原成合法的IP串。 复原IP地址 2. 题解 回溯列举所有的字符串可能&#xff0c;对长度和数值进行剪枝。 代码 class Solution { public:bool isValidSec(string &str, int len){if ( len > 3 || len < 1)retur…

Java关于实例对象调用静态变量和静态方法问题

直接去看原文 原文链接:Java关于实例对象调用静态变量和静态方法问题_java对象可以调用static方法吗_骑个小蜗牛的博客-CSDN博客 --------------------------------------------------------------------------------------------------------------------------------- 实例…

STM32H750之FreeRTOS学习--------(二)任务的创建和删除

FreeRTOS 二、任务的创建和删除 任务创建 动态方式创建任务 BaseType_t xTaskCreate ( TaskFunction_t pxTaskCode, /* 指向任务函数的指针 */ const char * const pcName, /* 任务名字&#xff0c;最大长度configMAX_TASK_NAME_LEN */const configSTACK_…

STM32F103的GPIO

文章目录 STM32F103的地址STM32F103的GPIOA的地址推算 STM32F103的地址 GPIO 都是挂载在 APB2 总线之上。 STM32F103的GPIOA的地址推算 &#xff08;出自STM32F103开发指南P127&#xff09; GPIOA 的 7 个寄存器都是 32 位的&#xff0c;所以每个寄存器占有 4个地址&#x…

MES的物料管理

----物料管理的定义和作用---- 物料管理在制造执行系统&#xff08;MES&#xff09;中扮演着至关重要的角色。通过有效的物料管理&#xff0c;企业可以实现生产过程的高效性、准确性和可靠性&#xff0c;从而提高生产效率并降低成本。 一、物料管理的定义 物料管理是指对生产过…

Fabric.js 复制粘贴元素

本文简介 点赞 关注 收藏 学会了 当你要复制一个 fabric 的元素时&#xff0c;你考虑到的是什么&#xff1f;是深拷贝当前选中对象再添加到画布中&#xff1f; 其实&#xff0c;fabric.js 提供了一个克隆方法&#xff0c;在 fabric.js 官网的案例里也有这个demo&#xff1a…

分布式消息队列:Rabbitmq(2)

目录 一:交换机 1:Direct交换机 1.1生产者端代码: 1.2:消费者端代码: 2:Topic主题交换机 2.1:生产者代码: 2.2:消费者代码: 二:核心特性 2.1:消息过期机制 2.1.1:给队列中的全部消息指定过期时间 2.1.2:给某条消息指定过期时间 2.2:死信队列 一:交换机 1:Direct交…

elasticsearch-5.6.15集群部署,如何部署x-pack并添加安全认证

目录 一、环境 1、JDK、映射、域名、三墙 2、三台服务器创建用户、并为用户授权 二、配置elasticsearch-5.6.15实例 1、官网获取elasticsearch-5.6.15.tar.gz&#xff0c;拉取到三台服务器 2、elas环境准备 3、修改elasticsearch.yml配置 4、修改软、硬件线程数 5、修改…

GAMP源码阅读(中)伪距单点定位 SPP

原始 Markdown文档、Visio流程图、XMind思维导图见&#xff1a;https://github.com/LiZhengXiao99/Navigation-Learning 文章目录 一、SPP 解算1、spp()&#xff1a;单点定位主入口函数2、estpos()3、estpose_()4、valsol()&#xff1a;GDOP和卡方检验结果有效性 二、卫星位置钟…

基于SSM的n省出口基地公共信息服务平台设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

vue3-vite-ts-pinia

Vue3 vite Ts pinia 实战 源码 electron 仓库地址&#xff1a;https://gitee.com/szxio/vue3-vite-ts-pinia 视频地址&#xff1a;小满Vue3&#xff08;课程导读&#xff09;_哔哩哔哩_bilibili 课件地址&#xff1a;Vue3_小满zs的博客-CSDN博客 初始化Vue3项目 方式一 …