python学opencv|读取图像(三十七 )截断处理

【1】引言

前序已经学习了图像的多种BGR值处理方式,包括阈值处理、反阈值处理、零值处理和反零值处理,相关链接包括:

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

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

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

python学opencv|读取图像(三十六)(反)零值处理-CSDN博客

实现这些处理都是通过改变cv2.threshold()函数中的type参数实现:

cv.THRESH_BINARY阈值处理的原则是:给定阈值开关,大于开关的像素点,对其BGR值强制赋最大值255,相反则赋0;

cv.THRESH_BINARY_INV反阈值处理的原则是: 给定阈值开关,大于开关的像素点,对其BGR值强制赋0,相反则赋最大值255;

cv.THRESH_TOZERO零值处理的原则是:给定阈值开关,不大于开关的像素点,对其BGR值强制赋最小值0,相反则保持原值;

cv.THRESH_TOZERO_INV反零值处理的原则是: 给定阈值开关,大于开关的像素点,对其BGR值强制赋0,相反则保持原值。

上述处理都有强行赋值的功能,如果有时候不需要赋最大值或者最小值,只希望保留原值,这时候就需要做阈值截断处理。

【2】官网教程

阈值截断处理也是通过改变cv2.threshold()函数中的type参数实现:

cv.THRESH_TRUNC截断处理的原则是:给定阈值开关,不大于开关的像素点,对其BGR值保持原值,相反则强制赋阈值;

相应的官网链接为: OpenCV: Miscellaneous Image Transformations

官网给出的说明为:

++图1++

相应的对上述几种处理方式进行对比有:

++图2 综合对比++

【3】代码测试

【3.1】灰度图像

首先是引入需要的模块和图像:

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

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

然后依次进行阈值-零值-截断处理:

python 复制代码
#阈值和零值处理
t1,dst1=cv.threshold(src,58,158,cv.THRESH_BINARY) #阈值-阈值开关58,阈值上限158
t2,dst2=cv.threshold(src,58,158,cv.THRESH_TOZERO) #零值-阈值开关100,阈值上限255

#截断处理
t3,dst3=cv.threshold(src,58,158,cv.THRESH_TOZERO) #截断-阈值开关158,阈值上限200

之后补充反阈值和反零值处理做对比:

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

#反阈值和反零值处理
tt1,dstt1=cv.threshold(src,58,158,cv.THRESH_BINARY_INV) #阈值开关100,阈值上限255
tt2,dstt2=cv.threshold(src,58,158,cv.THRESH_TOZERO_INV) #阈值开关100,阈值上限255

#tt1,dstt1=cv.threshold(src,58,158,cv.THRESH_TOZERO_INV) #阈值开关58,阈值上限158
#tt2,dstt2=cv.threshold(src,100,255,cv.THRESH_TOZERO_INV) #阈值开关100,阈值上限255
#tt3,dstt3=cv.threshold(src,0,255,cv.THRESH_TOZERO_INV) #阈值开关0,阈值上限255

之后进行效果对比,输出特定点的像素值:

python 复制代码
#和原图对比
ttt1=np.hstack((dst,dst1,dst3)) #原图-阈值-截断对比
ttt2=np.hstack((dst,dst2,dst3)) #原图-零值-截断对比
ttt3=np.hstack((dst,dstt1,dst3)) #原图-反阈值-截断对比
ttt4=np.hstack((dst,dstt2,dst3)) #原图-反零值-截断对比
ttt5=np.hstack((dst,dst1,dst2)) #原图-阈值-零值对比
ttt6=np.hstack((dst3,dstt1,dstt2)) #截断-反阈值-反零值对比
ttt7=np.vstack((ttt6,ttt5)) #原图-阈值-零值-截断-反阈值-反零值对比
#展示图像
cv.imshow('srcft0', dst)  # 在屏幕展示效果
cv.imshow('srcft1', ttt1)  # 在屏幕展示效果
cv.imshow('srcft2', ttt2)  # 在屏幕展示效果
cv.imshow('srcft3', ttt3)  # 在屏幕展示效果
cv.imshow('srcft4', ttt4)  # 在屏幕展示效果
cv.imshow('srcft5', ttt7)  # 在屏幕展示效果
#显示BGR值
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
print("反阈值-dstt1像素数为[100,100]位置处的BGR=", dstt1[100, 100])  # 获取像素数为[100,100]位置处的BGR
print("反零值-dstt2像素数为[100,100]位置处的BGR=", dstt2[100, 100])  # 获取像素数为[100,100]位置处的BGR
#print("dstt3像素数为[100,100]位置处的BGR=", dstt3[100, 100])  # 获取像素数为[100,100]位置处的BGR

然后保存相关图像,释放所有窗口:

python 复制代码
#保存图像
cv.imwrite('srcf-J-VC-dst.png', dst)  # 保存图像
cv.imwrite('srcf-J-t1-VC-ttt1.png', ttt1)  # 保存图像
cv.imwrite('srcf-J-t2-VC-ttt2.png', ttt2)  # 保存图像
cv.imwrite('srcf-J-t3-VC-ttt3.png', ttt3)  # 保存图像
cv.imwrite('srcf-J-t3-VC-ttt4.png', ttt4)  # 保存图像
cv.imwrite('srcf-J-t3-VC-ttt7.png', ttt7)  # 保存图像
cv.waitKey()  # 图像不会自动关闭
cv.destroyAllWindows()  # 释放所有窗口

此处使用的原图为:

++图3 原图++

转化后的灰度图为:

++图2 读入后的灰度图++

进行处理后的图像对比效果为:

++图3 原图-阈值-截断对比++

++++

++图4 原图-零值-截断对比++

++++

++图5 原图-反阈值-截断对比++

++图6 原图-反零值-截断对比++

++图7++原图-阈值-零值-截断-反阈值-反零值对比

由上述几个转化后的图像对比效果可以看出:零值处理的效果相对来说较好,截断处理会给出一种"图像变暗"的感觉,这种变暗是由于一部分大于阈值(58)的像素点阈值被拉低到阈值上限(158)造成的。

此时的特定像素点输出为:

++图8 像素点BGR值++

【3.2】彩色图像

之后进行彩色图像的零值和反零值处理,这只需要改一行代码,将src = cv.imread('srcun.png',0)改为:

复制代码
src = cv.imread('srcun.png') #读取图像

直接输出完整代码:

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

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

#阈值和零值处理
t1,dst1=cv.threshold(src,58,158,cv.THRESH_BINARY) #阈值-阈值开关58,阈值上限158
t2,dst2=cv.threshold(src,58,158,cv.THRESH_TOZERO) #零值-阈值开关100,阈值上限255

#截断处理
t3,dst3=cv.threshold(src,58,158, cv.THRESH_TRUNC) #截断-阈值开关158,阈值上限200

#t2,dst2=cv.threshold(src,100,255,cv.THRESH_TOZERO) #阈值开关100,阈值上限255
#t3,dst3=cv.threshold(src,0,255,cv.THRESH_TOZERO) #阈值开关0,阈值上限255

#反阈值和反零值处理
tt1,dstt1=cv.threshold(src,58,158,cv.THRESH_BINARY_INV) #阈值开关100,阈值上限255
tt2,dstt2=cv.threshold(src,58,158,cv.THRESH_TOZERO_INV) #阈值开关100,阈值上限255

#tt1,dstt1=cv.threshold(src,58,158,cv.THRESH_TOZERO_INV) #阈值开关58,阈值上限158
#tt2,dstt2=cv.threshold(src,100,255,cv.THRESH_TOZERO_INV) #阈值开关100,阈值上限255
#tt3,dstt3=cv.threshold(src,0,255,cv.THRESH_TOZERO_INV) #阈值开关0,阈值上限255

#和原图对比
ttt1=np.hstack((dst,dst1,dst3)) #原图-阈值-截断对比
ttt2=np.hstack((dst,dst2,dst3)) #原图-零值-截断对比
ttt3=np.hstack((dst,dstt1,dst3)) #原图-反阈值-截断对比
ttt4=np.hstack((dst,dstt2,dst3)) #原图-反零值-截断对比
ttt5=np.hstack((dst,dst1,dst2)) #原图-阈值-零值对比
ttt6=np.hstack((dst3,dstt1,dstt2)) #截断-反阈值-反零值对比
ttt7=np.vstack((ttt5,ttt6)) #原图-阈值-零值-截断-反阈值-反零值对比
#展示图像
cv.imshow('srcft0', dst)  # 在屏幕展示效果
cv.imshow('srcft1', ttt1)  # 在屏幕展示效果
cv.imshow('srcft2', ttt2)  # 在屏幕展示效果
cv.imshow('srcft3', ttt3)  # 在屏幕展示效果
cv.imshow('srcft4', ttt4)  # 在屏幕展示效果
cv.imshow('srcft5', ttt7)  # 在屏幕展示效果
#显示BGR值
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
print("反阈值-dstt1像素数为[100,100]位置处的BGR=", dstt1[100, 100])  # 获取像素数为[100,100]位置处的BGR
print("反零值-dstt2像素数为[100,100]位置处的BGR=", dstt2[100, 100])  # 获取像素数为[100,100]位置处的BGR
#print("dstt3像素数为[100,100]位置处的BGR=", dstt3[100, 100])  # 获取像素数为[100,100]位置处的BGR

#保存图像
cv.imwrite('srcf-JC-VC-dst.png', dst)  # 保存图像
cv.imwrite('srcf-JC-t1-VC-ttt1.png', ttt1)  # 保存图像
cv.imwrite('srcf-JC-t2-VC-ttt2.png', ttt2)  # 保存图像
cv.imwrite('srcf-JC-t3-VC-ttt3.png', ttt3)  # 保存图像
cv.imwrite('srcf-JC-t3-VC-ttt4.png', ttt4)  # 保存图像
cv.imwrite('srcf-JC-t3-VC-ttt7.png', ttt7)  # 保存图像
cv.waitKey()  # 图像不会自动关闭
cv.destroyAllWindows()  # 释放所有窗口

进行处理后的图像对比效果为:

++图9 原图-阈值-截断对比++

++图10 原图-零值-截断对比++

++++

++图11 原图-反阈值-截断对比++

++++

++图12 原图-反零值-截断对比++

++++

++图13++原图-阈值-零值-截断-反阈值-反零值对比

此时的特定像素点输出为:

++图14 像素点BGR值++

综合上述图像**:**

零值处理的效果相对来说较好,因为零值处理让本身RGB值小于阈值开关的像素点对应RGB=0,相当于让这些点直接变成黑点,而亮的地方保持不变,所以实际上是增强了对比效果

截断处理会给出一种"图像变暗"的感觉,这种变暗是由于一部分大于阈值(58)的像素点阈值被拉低到阈值上限(158)造成的。

++图15 效果对比++

【4】细节说明

截断处理暂无反截断处理。

【5】总结

掌握了python+opencv实现图像截断处理的技巧。

相关推荐
仗剑_走天涯34 分钟前
基于pytorch.nn模块实现线性模型
人工智能·pytorch·python·深度学习
cnbestec2 小时前
协作机器人UR7e与UR12e:轻量化设计与高负载能力助力“小而美”智造升级
人工智能·机器人·协作机器人·ur协作机器人·ur7e·ur12e
zskj_zhyl2 小时前
毫米波雷达守护银发安全:七彩喜跌倒检测仪重构居家养老防线
人工智能·安全·重构
gaosushexiangji3 小时前
利用sCMOS科学相机测量激光散射强度
大数据·人工智能·数码相机·计算机视觉
ai小鬼头4 小时前
AIStarter新版重磅来袭!永久订阅限时福利抢先看
人工智能·开源·github
说私域4 小时前
从品牌附庸到自我表达:定制开发开源AI智能名片S2B2C商城小程序赋能下的营销变革
人工智能·小程序
飞哥数智坊5 小时前
新版定价不够用,Cursor如何退回旧版定价
人工智能·cursor
12点一刻5 小时前
搭建自动化工作流:探寻解放双手的有效方案(2)
运维·人工智能·自动化·deepseek
未来之窗软件服务5 小时前
东方仙盟AI数据中间件使用教程:开启数据交互与自动化应用新时代——仙盟创梦IDE
运维·人工智能·自动化·仙盟创梦ide·东方仙盟·阿雪技术观
JNU freshman6 小时前
计算机视觉速成 之 概述
人工智能·计算机视觉