在前面我们介绍了直方图均衡可以调整图像的对比度,那么还有没有其他方式调整对比度呢?答案是肯定的,今天就来招硬核的。
这招硬核方法就是参考灰度图像的阈值处理,我们知道灰度图像的阈值处理的基本思想是:
将图像中灰度值大于等于指定阈值的,将其设置为255,小于该值的设置为0。
不过阈值处理得到的是二值图,用于进行对比度增强必须进行调整。可以改成如下:
将图像中灰度值大于等于指定阈值的,将其灰度值设置为原灰度值+x,小于该值的设置为原灰度值-x。其中x为根据对比度调整需要设置的一个固定值。
在用数码相机等拍摄白纸的情况,得到的图像并不是真正的白纸,而是带不均匀灰度的浅灰色图片,这种情况需要进行调整才能得到比较合适的背景和前景。下面以一张白纸照片粘贴文字的图片作为处理对象,该图片如下:
下面用OpenCV-Python来实现上述算法:
import numpy as np
import cv2
from opencvPublic import preparePreviewImg,previewImgList,readImgFile
def adjustImgContrast():
img = readImgFile(r'f:\pic\paper.jpg',True)
bigmask = cv2.compare(img, np.uint8([127]), cv2.CMP_GE)
smallmask = cv2.bitwise_not(bigmask)
x = 90
big = cv2.add(img, x, mask=bigmask)
small = cv2.subtract(img, x, mask=smallmask)
res = cv2.add(big, small)
preparePreviewImg('输入图像:白纸照片', img, fontSize=38, color=(255, 255, 255))
preparePreviewImg('https://blog.csdn.net/LaoYuanPython', None, fontSize=38, color=(255, 255, 255))
preparePreviewImg('调整对比度照片', res, fontSize=38, color=(255, 0, 0))
previewImgList()
print('\033[31m老猿Python网址:\033[34mhttps://blog.csdn.net/LaoYuanPython\033[0m,同名微信公众号:\033[34m老猿Python')
上述实现用了compare函数,也可以直接逐个像素处理。
我们来看处理结果:
可以看到处理后的图片效果比原图片效果好了很多,当然可以继续调大x的值得到更好的效果。
以上代码中,opencvPublic是老猿常用的图像处理自定义方法的公用模块,本文使用的自定义公用模块函数preparePreviewImg,previewImgList,readImgFile,cmpMatrix,print2DMatrix,其功能请参考《https://blog.csdn.net/LaoYuanPython/article/details/111351901 OpenCV-Python图形图像处理:自用的一些工具函数功能及调用语法介绍》中的介绍。
上面的图片进行了对比度的调整,但得到的背景并不是理想的白纸,背景色的灰度也不一致。下面提供一种这种图片处理变成纯白背景的更好实现方法。
漂白背景色的代码:
import cv2
from opencvPublic import preparePreviewImg,previewImgList,readImgFile
def adjustWhitePaperBG():
img = readImgFile(r'f:\pic\paper.jpg', True)
kernel1 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
close = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel1)
div = np.float32(img) / (close)
res = np.uint8(cv2.normalize(div, div, 0, 255, cv2.NORM_MINMAX))
preparePreviewImg('输入图像:白纸照片', img, fontSize=38, color=(255, 255, 255))
preparePreviewImg('https://blog.csdn.net/LaoYuanPython', None, fontSize=38, color=(255, 255, 255))
preparePreviewImg('输出图像:白纸', res, fontSize=38, color=(255, 0, 0))
previewImgList()
print('\033[31m老猿Python网址:\033[34mhttps://blog.csdn.net/LaoYuanPython\033[0m,同名微信公众号:\033[34m老猿Python')
adjustWhitePaperBG()
本节介绍了一种利用阈值强制调整图像对比度的通用方法以及OpenCV-Python的实现,同时介绍了一个基于带文字的白纸照片对背景色进行漂白的案例,相关方法可以用于图像的增强。
https://stackoverflow.com/questions/10549245/how-can-i-adjust-contrast-in-opencv-in-c
更多图像处理的内容请参考专栏《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》、《https://blog.csdn.net/laoyuanpython/category_10581071.html OpenCV-Python初学者疑难问题集》及《图像处理基础知识》的介绍。
如对文章内容存在疑问,可在博客评论区留言,或关注博客左边的:老猿Python 微信公号发消息咨询。
如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!
前两个专栏都适合有一定Python基础但无相关知识的小白读者学习,第三个专栏请大家结合《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的学习使用。
对于缺乏Python基础的同仁,可以通过老猿的免费专栏《https://blog.csdn.net/laoyuanpython/category_9831699.html 专栏:Python基础教程目录)从零开始学习Python。
如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。