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

【1】引言

前序已经掌握了使用阈值处理函数控制灰度图的RGB值,相关链接为:

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

在更早的学习中,灰度图的RGB只有一个通道,也就是各个像素点对应的BGR值都只用一个数表达。

但是彩色图像各个像素点的BGR值是三个通道,需要三个数来表达。那此时阈值函数是否还有作用,今天就来一起探讨一下。

【2】灰度图像定点像素BGR

此处使用的原图是:

++图1++

然后把图像读入,直接转化为灰度:

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

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

这里的dst是原始的灰度图像,用来和后面阈值函数处理过的图像进行对比。

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

之后就是用阈值函数处理灰度图像:

python 复制代码
#展示图像
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

为了单独显示像素点为100,100的RGB值,使用print()函数将其直接输出了,这里输出了四个不同图像在像素点为100,100的RGB值。

然后是保存图像:

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

运行代码后,获得的图像和python学opencv|读取图像(三十三)阈值处理图像-限定像素-CSDN博客完全一致,同时新增了像素点的RGB值输出:

++图2 灰度图RGB值读取++

追溯dst1、dst:2和dst3的阈值开关:

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

在像素点100,100,原本的灰度图RGB=189,大于任何一个阈值开关,所以这个像素点的RGB值全部强制等于255。

测试的完整代码为:

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) #阈值开关58,阈值上限158
t2,dst2=cv.threshold(src,100,255,cv.THRESH_BINARY) #阈值开关100,阈值上限255
t3,dst3=cv.threshold(src,0,255,cv.THRESH_BINARY) #阈值开关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-c.png', dst)  # 保存图像
cv.imwrite('srcf-m-t1-c.png', dst1)  # 保存图像
cv.imwrite('srcf-m-t2-c.png', dst2)  # 保存图像
cv.imwrite('srcf-m-t3-c.png', dst3)  # 保存图像
cv.waitKey()  # 图像不会自动关闭
cv.destroyAllWindows()  # 释放所有窗口

【3】彩色图像阈值函数测试

要想调用彩色图像,最简单的办法就是读入图像的时候,不要设置为灰度图,只需要修改一行代码:

复制代码
src = cv.imread('scasrcf.png',0)  #,0删除就能获得彩色图像

在此基础上,代码生成效率大幅增加,此时的完整代码为:

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

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


t1,dst1=cv.threshold(src,58,158,cv.THRESH_BINARY) #阈值开关58,阈值上限158
t2,dst2=cv.threshold(src,100,255,cv.THRESH_BINARY) #阈值开关100,阈值上限255
t3,dst3=cv.threshold(src,0,255,cv.THRESH_BINARY) #阈值开关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-c.png', dst)  # 保存图像
cv.imwrite('srcf-m-t1-c.png', dst1)  # 保存图像
cv.imwrite('srcf-m-t2-c.png', dst2)  # 保存图像
cv.imwrite('srcf-m-t3-c.png', dst3)  # 保存图像
cv.waitKey()  # 图像不会自动关闭
cv.destroyAllWindows()  # 释放所有窗口

继续使用图1做原图,此时经过阈值函数处理,获得的图像分别为:

++图3 阈值开关58,阈值上限158++

++图4 阈值开关100,阈值上限255++

++++

++图5 阈值开关0,阈值上限255++

相应的,也输出了像素点100,100处的BGR值:

++图6 彩色图RGB值读取++

为了更好理解,先把阈值开关复制过来:

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

对于原图B=69,大于dst1和dst3的阈值开关,所以会直接将B通道值设定为最大阈值255,然后在dst2图像里强制设为0;对于原图的GR通道,同时大于dst1、dst2和dst3的阈值开关,所以会直接将GR通道值设定为最大阈值255。

【4】细节说明

阈值处理函数cv2.threshold()对灰度图和彩色图都有效果,本身不改变像素值,值改变各个像素点对应的RGB值。

【5】总结

掌握了python+opencv设置彩色图像各个像素点RGB阈值的技巧

相关推荐
我不是疯子是傻子12 分钟前
串口通信数据帧粘包拆包再进化:基于 Qt 的滑动窗口与 CRC 校验实战
开发语言·qt
程序员老陆21 分钟前
Qt中实现窗口真全屏(覆盖Windows任务栏)
开发语言·windows·qt
霸道流氓气质1 小时前
Java中信号量(Semaphore):从本地到分布式
java·开发语言·分布式
怪奇云呼军1 小时前
G.711、Opus 和重采样会拖慢识别吗?闪电智能VoiceAgent 的音频入口怎么选
java·人工智能·python·算法·云计算·音视频
ZC跨境爬虫1 小时前
LeetCode 27. 移除元素(双指针详解 + Java Python 多解法对比)
java·python·leetcode
路溪非溪1 小时前
Python语言的执行流程总结
开发语言·python
民乐团扒谱机1 小时前
【超详解】量子克拉美罗下界QCRB:时延估计精度极限推导+MATLAB多场景绘图实战
开发语言·机器学习·matlab·量子力学·qcrb
宋均浩2 小时前
AI 生成代码质量防线实战:5 个 CI/CD 配置,把 8% 的逻辑错拦在线上之前0
python
树码小子2 小时前
Pycharm解释器配置问题解决
ide·python·pycharm
国雪2 小时前
python-协程
python