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