专栏首页行走的机械人【opencv实践】图像增强基本操作

【opencv实践】图像增强基本操作

上面这幅黑乎乎的图就是我们今天要处理的图片,这是书的一页,但特别特别黑,对于这种因为阴影而导致的细节缺失,我们就可以尝试对其进行图像增强了。

图像增强真的有不少内容,范围也很广泛,今天就只针对这个例子进行实践了。

本文代码都是成块儿的,大家可以复制自行组合

整体框架搭建

首先就先写个框架啦,读取图片显示图片啥的:

#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
  Mat img_output;
  Mat img_input = imread("bookpage.jpg",0);
  if (img_input.empty())
  {
    cout << "图片为空" << endl;
  }
  //在这加图片处理的函数
  imshow("输入", img_input);
  imshow("输出", img_output);
  waitKey();
  return 0;
}

我们以灰度图将原书页照片读进来,显示如下:

可以看到整个以黑乎乎的,看着太难受了,不过虽然我们人眼看着那些字是无法识别的,但其实在像素层面上,字的轮廓还是依然在的,而我们要做的就是将图片增强到文字可以为人眼所见的程度。

手机相机处理

在我们开始自己处理之前呢,先看下用手机相机随便处理一下的结果:

我们自己处理,怎么也得达到这种效果吧。

直方图均衡化

直方图均衡化是常见的一种图像增强技术,直方图均衡可以让像素值由狭小区域扩大到整个像素区域,如下图,横轴为像素灰度值,竖轴为该像素值在图片中的比例:

左图在直方图均衡化之后,像素值有明显的扩散分布,进而提高了图片的对比度。

而本例中就是因为图像太黑,也就是像素值集中分布在黑色部分,均衡化可以提高对比度,我们可以看下均衡化的效果:

//直方图均衡化equalizeHist(img_input, img_output);

可以看到效果并不是很好,但这还只是初步处理,也许再进行直方图局部均衡化就会更好一些了。

阈值化操作

我们可以知道图片很黑是因为有很多灰度级很低的像素聚集,我们只要将这些像素过滤掉就可以了,过滤我们可以采用阈值化操作或者二值化操作,我们看看阈值化操作:

//阈值化操作threshold(img_input, img_output, 8, 255, THRESH_BINARY);

可以看到结果也并不十分理想。但opencv还有一个自适应阈值函数,这个函数要更为巧妙一些

  //自适应阈值函数  adaptiveThreshold(img_input, img_output, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 7, 3);

可以看到虽然我们可以看清楚上面的字,但并不美观,而且因为阈值化操作的原因,书页颜色非黑即白,非常失真。

调整亮度和对比度

我们可以遍历图片中(i , j)处的像素,并对其进行如下操作:

  • f(i,j)代表原图像像素
  • g(i,j)代表处理后的图像像素
  • a 称为增益,用来调节图像对比度
  • b 称为偏置,用来调整图像亮度
//@srcImage:输入单通道图像
//@a:增益,调对比度
//@b:偏置,调亮度
Mat contrast_bright(Mat img_input,float a = 1, float b = 0)
{
  Mat dstImage,srcImage = img_input;
  srcImage.copyTo(dstImage);
  int row = srcImage.rows;
  int col = srcImage.cols;
  // 两个个for循环,执行运算 dstImage(i,j) = a*srcImage(i,j) + b
  for (int y = 0; y < row; y++)
  {
    for (int x = 0; x < col; x++)
    {
      dstImage.at<uchar>(y, x) = saturate_cast<uchar>(a*(img_input.at<uchar>(y, x)) + b );
    }
  }
  return dstImage;
}
  //调节亮度和对比度  img_output = contrast_bright(img_input,6,60);

可以看到,通过调节亮度和对比度的方法,已经可以达到不错的效果。

对像素进行log变换和伽马变换

我们还可以尝试对图像进行变换,比如log函数变换和伽马变换。以伽马变换为例:

先看一下伽马变换的公式:

输入r就是图片某点像素值,输出s为变换后的像素值。下图为该公式c取1,γ取不同值时的函数图形:

我们可以看到:

  • 当γ小于1时,以γ=0.10为例,该变换会将窄范围的低级灰度转变为灰度级较高的值,直观上体现为图片变亮。
  • 当γ大于1时,以γ=5.0所示,该变换会将较宽范围的灰度转变为低级灰度,直观上体现为变暗。

简单代码实现:

//@img_input:输入单通道图像
//@gamma:gamma次方
//@n_c:乘以常数n_c
Mat gammaTrans(Mat& img_input, float gamma, int n_c)
{
  Mat img_Gamma(img_input.size(), CV_8UC1);
  for (int i = 0; i < img_input.rows; i++)
  {
    for (int j = 0; j < img_input.cols; j++)
    {
      img_Gamma.at<uchar>(i, j) = n_c * pow(img_input.at<uchar>(i, j), gamma);
    }
  }
  normalize(img_Gamma, img_Gamma, 0, 255, CV_MINMAX); //将像素值映射到0-255范围
  return img_Gamma;
}
  //伽马变换  img_output = gammaTrans(img_input,0.4,3);

伽马变换只是方式之一,可以用来像素映射的函数多种多样,一般都视实际情况而定。

尾言

到此为止我们其实已经可以看清图片上的文字了,其中改变亮度和对比度的效果是最好的,但我们还可以将这几种方法甚至其他方法混合使用,来达到更好的效果。

如果文中有什么表述错误的地方,欢迎大家评论指正。

本文分享自微信公众号 - Opencv视觉实践(gh_31e12b1be0e0),作者:周旋

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-03-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【opencv】带你再学一遍直方图

    直方图到底可以干什么呢?我觉得最明显的作用就是有利于你对这个图像进行分析了,直方图就像我们常用的统计图,只不过直方图统计的是图片的一些特征,例如像素值(这是最常...

    周旋
  • 图像腌膜Mask的常规操作你真的信手拈来吗?

    我对图像腌膜的含义一直有些模糊,今天写了几行代码,证明了我这模糊的印象倒是正确的。今天借一个给图片添加水印的小例子,给大家总结一些图像腌膜的常规操作。

    周旋
  • 【3000字扫盲】来搞"颜色"!RGB/HSV/HSI颜色模型

    人眼有四种感光细胞,分别是三种锥状感光细胞,分别感知红,绿,蓝三色,以及感知黑白的杆状细胞。

    周旋
  • RGB888 转 YCbCr444 算法的 HDL 实现

    虽说 OV5640 可以通过寄存器的设置,直接输出 YCbCr444 格式的视频流,但为了研究图像处理,以及最基本的视频格式转换,有意执行一次 RGB888转 ...

    碎碎思
  • 图像增强综述

    作者:方阳, 转载请注明地址。 文件和代码可以在Github下载, markdown推荐用typora打开。 这篇文章是DIP的第二次作业,对图像增强技术进...

    努力努力再努力F
  • 字符串提取

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    喜欢ctrl的cxk
  • 线路检测:让自动驾驶汽车查看路线

    完全自动驾驶的乘用车并非“指日可待”。马斯克(Elon Musk)声称,特斯拉到2020年底将具备“完全自动驾驶”功能。特别是,他说,特斯拉的硬件已经为自动驾驶...

    代码医生工作室
  • matlab图像解密

    最近我一直在准备神经网络方面的推送。但是一直有人问我:以前发过一个关于图像加密的代码,一直没有等到解密的代码出来。该怎么解密。

    艾木樨
  • Caffe2 - (十八) 图片数据处理函数

    Caffe2 提供了对图片进行加载、裁剪、缩放、去均值、batch 等处理的函数 - helper.py.

    AIHGF
  • 用深度学习做个艺术画家 ——模仿实现PRISMA

    用户1737318

扫码关注云+社区

领取腾讯云代金券