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

相关推荐
紫小米1 小时前
后端日志管理
python·fastapi
你不是我我1 小时前
【Java 开发日记】HTTP3 性能更好,为什么内网微服务依然多用 HTTP2?HTTP2 内网优势是什么?
java·开发语言·微服务
tjl521314_212 小时前
04C++ 名称空间(Namespace)
开发语言·c++
赏金术士2 小时前
Kotlin 数据流与单双向绑定
android·开发语言·kotlin
白雪茫茫2 小时前
监督学习、半监督学习、无监督学习算法详解
python·学习·算法·ai
つ安静与叛逆的小籹人3 小时前
小红书API:通过笔记ID获取笔记详情数据教程
笔记·python
05候补工程师3 小时前
[实战复盘] 拒绝 AI 屎山!我从设计模式中学到的“调教”AI 新范式
人工智能·python·设计模式·ai·ai编程
逻辑驱动的ken3 小时前
Java高频面试场景题25
java·开发语言·深度学习·面试·职场和发展
AI人工智能+电脑小能手4 小时前
【大白话说Java面试题】【Java基础篇】第32题:Java的异常处理机制是什么
java·开发语言·后端·面试
阿豪只会阿巴5 小时前
【没事学点啥】TurboBlog轻量级个人博客项目——项目介绍
javascript·python·django·html