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阈值的技巧

相关推荐
e***74951 小时前
Modbus报文详解
服务器·开发语言·php
lly2024061 小时前
ASP 发送电子邮件详解
开发语言
小徐敲java1 小时前
python使用s7协议与plc进行数据通讯(HslCommunication模拟)
开发语言·python
likuolei1 小时前
XSL-FO 软件
java·开发语言·前端·数据库
6***37941 小时前
PHP在电商中的BigCommerce
开发语言·php
猫头虎1 小时前
如何解决 pip install 编译报错 fatal error: hdf5.h: No such file or directory(h5py)问题
人工智能·python·pycharm·开源·beautifulsoup·ai编程·pip
Dev7z2 小时前
基于Matlab的多制式条形码识别与图形界面(GUI)系统设计与实现
开发语言·matlab
合作小小程序员小小店2 小时前
桌面开发,在线%信息管理%系统,基于vs2022,c#,winform,sql server数据。
开发语言·数据库·sql·microsoft·c#
FL16238631292 小时前
ONNX RuntimeC++ 静态库下载安装和使用教程
开发语言·c++
星释2 小时前
Rust 练习册 95:React与响应式编程
开发语言·react.js·rust