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

相关推荐
only-lucky42 分钟前
C++中的 Eigen库使用
开发语言·c++
bianshaopeng1 小时前
ubuntu go 环境变量配置
开发语言·ubuntu·golang
元清加油1 小时前
【Goland】:协程和通道
服务器·开发语言·后端·网络协议·golang
这里有鱼汤1 小时前
原来基金经理都偷偷用这个指标选股,难怪回撤小还赚钱
后端·python
广州智造1 小时前
EPLAN教程:流体工程
开发语言·人工智能·python·算法·软件工程·软件构建
Enougme1 小时前
python-使用鼠标对图片进行涂抹&自定义绘图
python·opencv
wjm0410061 小时前
ios八股文 -- Objective-c
开发语言·ios·objective-c
小白(猿)员1 小时前
数据结构中的列表:深度解析数组与链表的实现与抉择
开发语言
CF14年老兵2 小时前
🐍 Python黑魔法手册:让你的代码从能跑到飞起的奇技淫巧
后端·python·trae
lpfasd1232 小时前
01_Go语言基础与环境搭建
开发语言·后端·golang