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

打印 上一主题 下一主题

主题 1606|帖子 1606|积分 4818

【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】灰度图像

起首是引入需要的模块和图像:
  1. import cv2 as cv # 引入CV模块
  2. import numpy as np #引入numpy模块
  3. # 读取图片
  4. src = cv.imread('srcun.png',0)
  5. dst=src#输出图像
复制代码
然后依次举行阈值-零值-截断处理:
  1. #阈值和零值处理
  2. t1,dst1=cv.threshold(src,58,158,cv.THRESH_BINARY) #阈值-阈值开关58,阈值上限158
  3. t2,dst2=cv.threshold(src,58,158,cv.THRESH_TOZERO) #零值-阈值开关100,阈值上限255
  4. #截断处理
  5. t3,dst3=cv.threshold(src,58,158,cv.THRESH_TOZERO) #截断-阈值开关158,阈值上限200
复制代码
之后补充反阈值和反零值处理做对比:
  1. #t2,dst2=cv.threshold(src,100,255,cv.THRESH_TOZERO) #阈值开关100,阈值上限255
  2. #t3,dst3=cv.threshold(src,0,255,cv.THRESH_TOZERO) #阈值开关0,阈值上限255
  3. #反阈值和反零值处理
  4. tt1,dstt1=cv.threshold(src,58,158,cv.THRESH_BINARY_INV) #阈值开关100,阈值上限255
  5. tt2,dstt2=cv.threshold(src,58,158,cv.THRESH_TOZERO_INV) #阈值开关100,阈值上限255
  6. #tt1,dstt1=cv.threshold(src,58,158,cv.THRESH_TOZERO_INV) #阈值开关58,阈值上限158
  7. #tt2,dstt2=cv.threshold(src,100,255,cv.THRESH_TOZERO_INV) #阈值开关100,阈值上限255
  8. #tt3,dstt3=cv.threshold(src,0,255,cv.THRESH_TOZERO_INV) #阈值开关0,阈值上限255
复制代码
之后举行效果对比,输出特定点的像素值:
  1. #和原图对比
  2. ttt1=np.hstack((dst,dst1,dst3)) #原图-阈值-截断对比
  3. ttt2=np.hstack((dst,dst2,dst3)) #原图-零值-截断对比
  4. ttt3=np.hstack((dst,dstt1,dst3)) #原图-反阈值-截断对比
  5. ttt4=np.hstack((dst,dstt2,dst3)) #原图-反零值-截断对比
  6. ttt5=np.hstack((dst,dst1,dst2)) #原图-阈值-零值对比
  7. ttt6=np.hstack((dst3,dstt1,dstt2)) #截断-反阈值-反零值对比
  8. ttt7=np.vstack((ttt6,ttt5)) #原图-阈值-零值-截断-反阈值-反零值对比
  9. #展示图像
  10. cv.imshow('srcft0', dst)  # 在屏幕展示效果
  11. cv.imshow('srcft1', ttt1)  # 在屏幕展示效果
  12. cv.imshow('srcft2', ttt2)  # 在屏幕展示效果
  13. cv.imshow('srcft3', ttt3)  # 在屏幕展示效果
  14. cv.imshow('srcft4', ttt4)  # 在屏幕展示效果
  15. cv.imshow('srcft5', ttt7)  # 在屏幕展示效果
  16. #显示BGR值
  17. print("原图-dst像素数为[100,100]位置处的BGR=", dst[100, 100])  # 获取像素数为[100,100]位置处的BGR
  18. print("阈值-dst1像素数为[100,100]位置处的BGR=", dst1[100, 100])  # 获取像素数为[100,100]位置处的BGR
  19. print("零值-dst2像素数为[100,100]位置处的BGR=", dst2[100, 100])  # 获取像素数为[100,100]位置处的BGR
  20. print("截断-dst3像素数为[100,100]位置处的BGR=", dst3[100, 100])  # 获取像素数为[100,100]位置处的BGR
  21. print("反阈值-dstt1像素数为[100,100]位置处的BGR=", dstt1[100, 100])  # 获取像素数为[100,100]位置处的BGR
  22. print("反零值-dstt2像素数为[100,100]位置处的BGR=", dstt2[100, 100])  # 获取像素数为[100,100]位置处的BGR
  23. #print("dstt3像素数为[100,100]位置处的BGR=", dstt3[100, 100])  # 获取像素数为[100,100]位置处的BGR
复制代码
然后保存相关图像,释放全部窗口:
  1. #保存图像
  2. cv.imwrite('srcf-J-VC-dst.png', dst)  # 保存图像
  3. cv.imwrite('srcf-J-t1-VC-ttt1.png', ttt1)  # 保存图像
  4. cv.imwrite('srcf-J-t2-VC-ttt2.png', ttt2)  # 保存图像
  5. cv.imwrite('srcf-J-t3-VC-ttt3.png', ttt3)  # 保存图像
  6. cv.imwrite('srcf-J-t3-VC-ttt4.png', ttt4)  # 保存图像
  7. cv.imwrite('srcf-J-t3-VC-ttt7.png', ttt7)  # 保存图像
  8. cv.waitKey()  # 图像不会自动关闭
  9. cv.destroyAllWindows()  # 释放所有窗口
复制代码
此处使用的原图为:

图3 原图

转化后的灰度图为:

图2  读入后的灰度图

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

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


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


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


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


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

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

图8 像素点BGR值

【3.2】彩色图像

之后举行彩色图像的零值和反零值处理,这只需要改一行代码,将src = cv.imread('srcun.png',0)改为:
  
  1. src = cv.imread('srcun.png') #读取图像
复制代码
直接输出完整代码:
  1. 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,阈值上限158t2,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
  2. #t3,dst3=cv.threshold(src,0,255,cv.THRESH_TOZERO) #阈值开关0,阈值上限255
  3. #反阈值和反零值处理
  4. tt1,dstt1=cv.threshold(src,58,158,cv.THRESH_BINARY_INV) #阈值开关100,阈值上限255
  5. tt2,dstt2=cv.threshold(src,58,158,cv.THRESH_TOZERO_INV) #阈值开关100,阈值上限255
  6. #tt1,dstt1=cv.threshold(src,58,158,cv.THRESH_TOZERO_INV) #阈值开关58,阈值上限158
  7. #tt2,dstt2=cv.threshold(src,100,255,cv.THRESH_TOZERO_INV) #阈值开关100,阈值上限255
  8. #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]位置处的BGRprint("阈值-dst1像素数为[100,100]位置处的BGR=", dst1[100, 100])  # 获取像素数为[100,100]位置处的BGRprint("零值-dst2像素数为[100,100]位置处的BGR=", dst2[100, 100])  # 获取像素数为[100,100]位置处的BGRprint("截断-dst3像素数为[100,100]位置处的BGR=", dst3[100, 100])  # 获取像素数为[100,100]位置处的BGRprint("反阈值-dstt1像素数为[100,100]位置处的BGR=", dstt1[100, 100])  # 获取像素数为[100,100]位置处的BGRprint("反零值-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实现图像截断处理的技巧。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

农妇山泉一亩田

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表