OPENCV图像处理提高(一)图像增强

简介: 在图像处理学习中会涉及到直方图,直方图很好地表现了图像的灰度信息;同时我们注意到在暗图像中,直方图的分量集中在灰度级的低端;亮图像的灰度值集中在直方图灰度值的高端;低对比度的图像有较窄的直方图,并集中于直方图的中间部分;高对比度的图像中直方图的分量覆盖很宽的范围,而且像素的分布没有太不均匀,只能看到少量垂线比其他高许多。通过图像增强可以有效地减弱这些缺陷

在图像处理学习中会涉及到直方图,直方图很好地表现了图像的灰度信息;同时我们注意到在暗图像中,直方图的分量集中在灰度级的低端;亮图像的灰度值集中在直方图灰度值的高端;低对比度的图像有较窄的直方图,并集中于直方图的中间部分;高对比度的图像中直方图的分量覆盖很宽的范围,而且像素的分布没有太不均匀,只能看到少量垂线比其他高许多。通过图像增强可以有效地减弱这些缺陷
人真皮成纤维细胞

                            图 1

人脸

                           图   2

如图1,细胞表面的一些地方较为模糊,图2,整体图片偏亮
来看先来看第一张图的直方分布图:
这里写图片描述
分量集中在灰度值较高地地方。
第二张图的直方分布图:
这里写图片描述
直方图

来看一下两张图片的直方分布图片:

下面两张是经图像增强处理图片:
处理后的细胞图片

                              图 3

可以明显看到图片比之前的要清晰;
再来看其直方分布图:
这里写图片描述

处理后的人像
图 4
人脸的直方分布图:
这里写图片描述
首先,我们设连续的灰度r和z,同时令Pr(r)Pz(z)表示其连续的概率密度函数。

Pr(r)
为原来图像的灰度概率函数, Pz(z)为经处理后的概率函数:
同时我们设一个随机变量s:
s=T(r)=(L1)r0Pr(w)dw
其中w为积分变量;
接着定义随机变量z:
G(z)=(L1)z0Pz(t)dt=s
其中t为积分变量;
由这两个公式可得 G(z)=T(r)
z=G1[T(r)]=G1(s)
当输入函数 Pr(r)时,变换函数 T(r)可得到s;同时, Pz(z)可经过 G(z)变换得到s,同时得到
z=G1[T(r)]=G1[(L1)r0Pr(w)dw]
在实际中图像的直方图灰度分量是离散的,处理离散量时,只求得到一个近似的直方图:
sk=T(rk)=(L1)kj=0Pr(rj)=L1MNkj=0nj,k=0,1,2,3,,L1
其中MN是图像总的像素点, nj是具有灰度值 rj的像素的个数,L是图像中可能的灰度级数;
接下来上代码:
#include<opencv2\opencv.hpp>
#include<opencv\cv.h>
#include<opencv2\core\core.hpp>
#include<stdlib.h>
#include<math.h>

using namespace cv;
using namespace std;

void  enhance(Mat src, Mat dir)
{    
    FILE *fp;
    fp = fopen("src.txt", "w");
    int srcpixel[256] = { 0 };
    int dirpixel[256] = { 0 };
    int p;//temp
    double srcprob[256];
    double dirprob[256] = {0};
    double zhong = src.rows*src.cols;
    for (int i = 0; i < src.rows; i++)
    {
        for (int j = 0; j < src.cols; j++)
        {

            p = src.at<uchar>(i, j);
            srcpixel[p]++;
        }
    }
    for (int i = 0; i < 255; i++)
    {
        srcprob[i] = srcpixel[i]/ zhong;
        fprintf(fp, "%lf  ", srcprob[i]);
        printf("srcpixel[%d]=%f\n", i, srcprob[i]);
    }
    double o=0;
    dirprob[0] = srcprob[0];
    for (int i = 1; i < 256; i++)
    {
        dirprob[i] = dirprob[i - 1] + srcprob[i];
    }
    for (int i = 0; i < src.rows; i++)
    {
        for (int j = 0; j < src.cols; j++)
        {
            p = src.at<uchar>(i, j);
            dir.at<uchar>(i, j) = 255 * dirprob[p];
        }
    }
    fclose(fp);
//  srcpixel[256] = { 0 };

    fp = fopen("dir.txt", "w");
    for (int i = 0; i < src.rows; i++)
    {
        for (int j = 0; j < src.cols; j++)
        {

            p = dir.at<uchar>(i, j);
            dirpixel[p]++;
        }
    }
    for (int i = 0; i < 255; i++)
    {
        srcprob[i] =dirpixel[i] / zhong;
        fprintf(fp, "%lf  ", srcprob[i]);
        printf("srcpixel[%d]=%f\n", i, srcprob[i]);
    }
    fclose(fp);



}
int main(int argc,char *argv[])
{

    Mat src= imread("3.jpg",0);
    Mat dir(src.rows,src.cols,CV_8UC1);
    imshow("src", src);
    //cvtColor(pic, pic, CV_BGR2GRAY);
    //imshow("12", pic);
    enhance(src, dir);
    imshow("drt", dir);
    imwrite("22.jpg", dir);
    waitKey();
}

这里 src,dir表示原来图像和目标图像,先遍历出各灰度值的像素个数,计算出概率prob,通过公式转化成目标图像的概率
fprintf将灰度值概率记下,方便用openGL或excel画出直方图进行比对

笔者能力有限,如有不足或错误欢迎指出

目录
相关文章
|
3月前
|
openCL 开发工具 C语言
OpenCV 图像处理学习手册:6~7
OpenCV 图像处理学习手册:6~7
77 0
|
3月前
|
存储 编解码 算法
OpenCV 图像处理学习手册:1~5
OpenCV 图像处理学习手册:1~5
32 0
|
2月前
|
人工智能 Linux API
OpenCV这么简单为啥不学——1.1、图像处理(灰度图、模糊图片、GaussianBlur函数、提取边缘、边缘膨胀、边缘细化)
OpenCV这么简单为啥不学——1.1、图像处理(灰度图、模糊图片、GaussianBlur函数、提取边缘、边缘膨胀、边缘细化)
46 0
|
4月前
|
算法 API 计算机视觉
OpenCV(图像处理)-基于Python-形态学处理-开运算、闭运算、顶帽、黑帽运算
1. 形态学 OpenCV形态学是一种基于OpenCV库的数字图像处理技术,主要用于处理图像的形状、结构和空间关系。它包括一系列图像处理工具和算法,包括膨胀、腐蚀、开运算、闭运算、形态学梯度、顶帽、黑帽等。
59 0
|
4月前
|
缓存 算法 计算机视觉
OpenCV图像处理-视频分割静态背景-MOG/MOG2/GMG
1.概念介绍 视频背景扣除原理:视频是一组连续的帧(一幅幅图组成),帧与帧之间关系密切(GOP/group of picture),在GOP中,背景几乎是不变的,变的永远是前景。
92 0
|
2月前
|
编解码 算法 自动驾驶
探索OpenCV:图像处理的利器
探索OpenCV:图像处理的利器
30 0
|
4月前
|
机器学习/深度学习 并行计算 算法
OpenCV简介、导入及图像处理基础方法讲解(图文解释 附源码)
OpenCV简介、导入及图像处理基础方法讲解(图文解释 附源码)
47 0
|
4月前
|
算法 计算机视觉
OpenCV图像处理-图像分割-MeanShift
1. 基本概念 MeanShift严格说来并不是用来对图像进行分割的,而是在色彩层面的平滑滤波。它会中和色彩分布相近的颜色,平滑色彩细节,侵蚀掉面积较小的的颜色区域,它以图像上任意一点P为圆心,半径为sp,色彩幅值为sr进行不断地迭代。
61 0
|
4月前
|
算法 计算机视觉
OpenCV4图像处理-图像交互式分割-GrabCut
1.理论介绍 用户指定前景的大体区域,剩下为背景区域,还可以明确指出某些地方为前景或者背景,GrabCut算法采用分段迭代的方法分析前景物体形成模型树,最后根据权重决定某个像素是前景还是背景。
23 0
|
4月前
|
计算机视觉 Python
OpenCV图像处理-图片拼接(Python)
1. 图片拼接原理 对于图像拼接主要分为两部分:1.特征点匹配,确定两幅图之间的位置关系;2.把所有图像投影变换到同一坐标系,并完成对接与融合。
115 0

热门文章

最新文章