OpenCV-Python调整图像对比度和带文字白纸照片背景漂白方法

一、引言

在前面我们介绍了直方图均衡可以调整图像的对比度,那么还有没有其他方式调整对比度呢?答案是肯定的,今天就来招硬核的。

二、对比度调整的硬核方法

这招硬核方法就是参考灰度图像的阈值处理,我们知道灰度图像的阈值处理的基本思想是:

将图像中灰度值大于等于指定阈值的,将其设置为255,小于该值的设置为0。

不过阈值处理得到的是二值图,用于进行对比度增强必须进行调整。可以改成如下:
将图像中灰度值大于等于指定阈值的,将其灰度值设置为原灰度值+x,小于该值的设置为原灰度值-x。其中x为根据对比度调整需要设置的一个固定值。

三、调整的实现

在用数码相机等拍摄白纸的情况,得到的图像并不是真正的白纸,而是带不均匀灰度的浅灰色图片,这种情况需要进行调整才能得到比较合适的背景和前景。下面以一张白纸照片粘贴文字的图片作为处理对象,该图片如下:
OpenCV-Python调整图像对比度和带文字白纸照片背景漂白方法_第1张图片

下面用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函数,也可以直接逐个像素处理。
我们来看处理结果:
OpenCV-Python调整图像对比度和带文字白纸照片背景漂白方法_第2张图片

可以看到处理后的图片效果比原图片效果好了很多,当然可以继续调大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调整图像对比度和带文字白纸照片背景漂白方法_第3张图片

五、小结

本节介绍了一种利用阈值强制调整图像对比度的通用方法以及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 微信公号发消息咨询。

写博不易,敬请支持:

如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!

关于老猿的付费专栏

  1. 付费专栏《https://blog.csdn.net/laoyuanpython/category_9607725.html 使用PyQt开发图形界面Python应用》专门介绍基于Python的PyQt图形界面开发基础教程,对应文章目录为《 https://blog.csdn.net/LaoYuanPython/article/details/107580932 使用PyQt开发图形界面Python应用专栏目录》;
  2. 付费专栏《https://blog.csdn.net/laoyuanpython/category_10232926.html moviepy音视频开发专栏 )详细介绍moviepy音视频剪辑合成处理的类相关方法及使用相关方法进行相关剪辑合成场景的处理,对应文章目录为《https://blog.csdn.net/LaoYuanPython/article/details/107574583 moviepy音视频开发专栏文章目录》;
  3. 付费专栏《https://blog.csdn.net/laoyuanpython/category_10581071.html OpenCV-Python初学者疑难问题集》为《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的伴生专栏,是笔者对OpenCV-Python图形图像处理学习中遇到的一些问题个人感悟的整合,相关资料基本上都是老猿反复研究的成果,有助于OpenCV-Python初学者比较深入地理解OpenCV,对应文章目录为《https://blog.csdn.net/LaoYuanPython/article/details/109713407 OpenCV-Python初学者疑难问题集专栏目录 》
  4. 付费专栏《https://blog.csdn.net/laoyuanpython/category_10762553.html Python爬虫入门 》站在一个互联网前端开发小白的角度介绍爬虫开发应知应会内容,包括爬虫入门的基础知识,以及爬取CSDN文章信息、博主信息、给文章点赞、评论等实战内容。

前两个专栏都适合有一定Python基础但无相关知识的小白读者学习,第三个专栏请大家结合《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的学习使用。

对于缺乏Python基础的同仁,可以通过老猿的免费专栏《https://blog.csdn.net/laoyuanpython/category_9831699.html 专栏:Python基础教程目录)从零开始学习Python。

如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。

老猿Python,跟老猿学Python!

☞ ░ 前往老猿Python博文目录 https://blog.csdn.net/LaoYuanPython ░

你可能感兴趣的