python学opencv|读取图像(三十五)反阈值处理

【1】引言

前序已经学习了对灰度图像和彩色图像的阈值处理,对图像的RGB通道强行赋值,相关链接为:

python学opencv|读取图像(三十三)阈值处理-灰度图像-CSDN博客

python学opencv|读取图像(三十四)阈值处理-彩色图像-CSDN博客

在应用上述阈值处理的过程中,我们调用的函数是cv2.threshold(),该函数的官网链接为:

OpenCV: Miscellaneous Image Transformations

在官网,我们会看到对cv2.threshold()函数的处理中,有一个type参数,这是我们之前未深入探讨的地方,今天我们就着重研究一下。

图1

【2】阈值和反阈值处理

点击图1中type对应的ThresholdTypes,会链接到新的网页:

OpenCV: Miscellaneous Image Transformations

在这里,我们主要关注两个type:

图2

图2显示了两个type:cv.THRESH_BINARY和cv.THRESH_BINARY_INV,这两个是完全过来的,第一个只要实际值大于阈值开关,就直接赋最大值,第二个则是不超过阈值开关时赋最大值。

cv.THRESH_BINARY在之前的两篇文章中,一直被cv2.threshold()调用。所以,如果做反阈值处理,cv2.threshold()函数就要调用cv.THRESH_BINARY_INV。

【3】代码测试

代码测试直接使用前两篇使用的代码,只需要修改cv2.threshold()函数,使其从调用cv.THRESH_BINARY该换为调用cv.THRESH_BINARY_INV即可。

【3.1】灰度图像

灰度图像反阈值处理使用的完整代码为:

python 复制代码
import cv2 as cv # 引入CV模块
import numpy as np #引入numpy模块

# 读取图片
src = cv.imread('scasrcf.png',0)
dst=src#输出图像


t1,dst1=cv.threshold(src,58,158,cv.THRESH_BINARY_INV) #阈值开关58,阈值上限158
t2,dst2=cv.threshold(src,100,255,cv.THRESH_BINARY_INV) #阈值开关100,阈值上限255
t3,dst3=cv.threshold(src,0,255,cv.THRESH_BINARY_INV) #阈值开关0,阈值上限255

#展示图像
cv.imshow('srcf', dst)  # 在屏幕展示效果
cv.imshow('srcft1', dst1)  # 在屏幕展示效果
cv.imshow('srcft2', dst2)  # 在屏幕展示效果
cv.imshow('srcft3', dst3)  # 在屏幕展示效果
print("dst像素数为[100,100]位置处的BGR=", dst[100, 100])  # 获取像素数为[100,100]位置处的BGR
print("dst1像素数为[100,100]位置处的BGR=", dst1[100, 100])  # 获取像素数为[100,100]位置处的BGR
print("dst2像素数为[100,100]位置处的BGR=", dst2[100, 100])  # 获取像素数为[100,100]位置处的BGR
print("dst3像素数为[100,100]位置处的BGR=", dst3[100, 100])  # 获取像素数为[100,100]位置处的BGR

#保存图像
cv.imwrite('srcf-m-V.png', dst)  # 保存图像
cv.imwrite('srcf-m-t1-V.png', dst1)  # 保存图像
cv.imwrite('srcf-m-t2-V.png', dst2)  # 保存图像
cv.imwrite('srcf-m-t3-V.png', dst3)  # 保存图像
cv.waitKey()  # 图像不会自动关闭
cv.destroyAllWindows()  # 释放所有窗口

可以看到,阈值处理函数全部调用了 cv.THRESH_BINARY_INV:

复制代码
t1,dst1=cv.threshold(src,58,158,cv.THRESH_BINARY_INV) #阈值开关58,阈值上限158
t2,dst2=cv.threshold(src,100,255,cv.THRESH_BINARY_INV) #阈值开关100,阈值上限255
t3,dst3=cv.threshold(src,0,255,cv.THRESH_BINARY_INV) #阈值开关0,阈值上限255

本次使用的原图是:

图2

获得的未做阈值处理的灰度图为:

++图3 未做阈值处理的灰度图++

此时经过阈值函数处理,获得的图像分别为:

++图4 阈值开关58,阈值上限158,反阈值处理++

++图5 阈值开关100,阈值上限255,反阈值处理++

++图6 阈值开关0,阈值上限255,反阈值处理++

经过此次反阈值处理,会发现:原图亮的地方变暗了,暗的地方变亮了。

如果仔细核对特定点的BGR值,也会发现这个结论:

++图7++

【3.2】彩色图像

彩色图像反阈值处理使用的完整代码为:

python 复制代码
import cv2 as cv # 引入CV模块
import numpy as np #引入numpy模块

# 读取图片
src = cv.imread('srcun.png')
dst=src#输出图像


t1,dst1=cv.threshold(src,58,158,cv.THRESH_BINARY_INV) #阈值开关58,阈值上限158
t2,dst2=cv.threshold(src,100,255,cv.THRESH_BINARY_INV) #阈值开关100,阈值上限255
t3,dst3=cv.threshold(src,0,255,cv.THRESH_BINARY_INV) #阈值开关0,阈值上限255

#展示图像
cv.imshow('srcf', dst)  # 在屏幕展示效果
cv.imshow('srcft1', dst1)  # 在屏幕展示效果
cv.imshow('srcft2', dst2)  # 在屏幕展示效果
cv.imshow('srcft3', dst3)  # 在屏幕展示效果
print("dst像素数为[100,100]位置处的BGR=", dst[100, 100])  # 获取像素数为[100,100]位置处的BGR
print("dst1像素数为[100,100]位置处的BGR=", dst1[100, 100])  # 获取像素数为[100,100]位置处的BGR
print("dst2像素数为[100,100]位置处的BGR=", dst2[100, 100])  # 获取像素数为[100,100]位置处的BGR
print("dst3像素数为[100,100]位置处的BGR=", dst3[100, 100])  # 获取像素数为[100,100]位置处的BGR

#保存图像
cv.imwrite('srcf-m-VC.png', dst)  # 保存图像
cv.imwrite('srcf-m-t1-VC.png', dst1)  # 保存图像
cv.imwrite('srcf-m-t2-VC.png', dst2)  # 保存图像
cv.imwrite('srcf-m-t3-VC.png', dst3)  # 保存图像
cv.waitKey()  # 图像不会自动关闭
cv.destroyAllWindows()  # 释放所有窗口

代码运行后,经过饭阈值处理的图像为:

++图8 阈值开关58,阈值上限158,反阈值处理++

++图9 阈值开关100,阈值上限255,反阈值处理++

++图10 阈值开关0,阈值上限255,反阈值处理、++

由图8、图9和图10反阈值效果图可见:

和灰度图像一致,对彩色图像,反阈值处理的结果也是让亮暗的地方反向变化。

特定像素点的BGR取值也能证明这一点:

图11

【4】细节说明

cv.THRESH_BINARY和cv.THRESH_BINARY_INV是完全相反的操作,但实际BGR值和阈值开关进行判断时,采取的操作都是按照:大于是一个取值,小于等于(不大于)是相反的取值。

【5】总结

掌握了python+opencv实现灰度图和彩色图像反阈值操作的技巧。

相关推荐
weixin_472339462 小时前
高效处理大体积Excel文件的Java技术方案解析
java·开发语言·excel
枯萎穿心攻击2 小时前
响应式编程入门教程第二节:构建 ObservableProperty<T> — 封装 ReactiveProperty 的高级用法
开发语言·unity·c#·游戏引擎
Eiceblue4 小时前
【免费.NET方案】CSV到PDF与DataTable的快速转换
开发语言·pdf·c#·.net
m0_555762904 小时前
Matlab 频谱分析 (Spectral Analysis)
开发语言·matlab
浪裡遊5 小时前
React Hooks全面解析:从基础到高级的实用指南
开发语言·前端·javascript·react.js·node.js·ecmascript·php
彭祥.6 小时前
Jetson边缘计算主板:Ubuntu 环境配置 CUDA 与 cudNN 推理环境 + OpenCV 与 C++ 进行目标分类
c++·opencv·分类
烛阴6 小时前
简单入门Python装饰器
前端·python
lzb_kkk6 小时前
【C++】C++四种类型转换操作符详解
开发语言·c++·windows·1024程序员节
好开心啊没烦恼6 小时前
Python 数据分析:numpy,说人话,说说数组维度。听故事学知识点怎么这么容易?
开发语言·人工智能·python·数据挖掘·数据分析·numpy
面朝大海,春不暖,花不开6 小时前
使用 Python 实现 ETL 流程:从文本文件提取到数据处理的全面指南
python·etl·原型模式