图像处理冈萨雷斯:局部直方图处理

  • 局部直方图处理(Local Histogram Processing)
    • 局部直方图均衡化
    • 解决办法:直方图统计(Histogram Statistics)
    • Matlab实现代码
    • 处理后的图像
    • 总结

局部直方图处理(Local Histogram Processing)

我们之前讨论的方法都是基于整张图像直方图进行处理(前面章节的后面再更新)。因此处理的结果也是全局性的,就是只能对整张图片进行优化。但是对于有些图像需要进行局部的优化处理,不墨迹了,直接看下图.

局部直方图均衡化

 左:原始图片 中:直方图均衡 右:局部直方图均衡

原始图像中,5个黑块隐藏着其他图案,你看你仔细看。通过直方图均衡处理后的图二,还是看不到隐藏的图案,这是因为直方图均衡化是将图片的直方图‘‘拉伸’’,而且直方图还遵循着一个规则,就是不能黑白颠倒,暗的像素点在均衡化后不能比该像素点亮的像素点还亮

我们在原图中可以看出,隐藏图案的亮度与黑块部分十分接近,因此直方图均衡不能够处理这种情况。

右图是局部直方图均衡处理后的图像。虽然可以看到隐藏图案,但是效果不是非常理想,整张图片变了颜色,隐藏图案也只剩下轮廓。这里就不介绍局部直方图均衡的方法了,若有需要可以留言给我。

解决办法:直方图统计(Histogram Statistics)

  1. 此刻我们的目的是,将对比度较低的地方找出(隐藏图案与黑块),并将对比度较低区域的像素提高(将隐藏图案变亮),并且保持其他地方亮度不变。

    这就是我们想要的效果。接着看哈。我会逐渐讲解思路和每个公式的意义。

    原图的均值为
    (1)

    原图的方差为
    (2)

    其次我们先定义一个3x3邻域,则该邻域Sxy的方差和均值为:
    (3)

    (4)

    我们通过下面的公式来输出图片
    (5)

  2. 就这几个公式就能够达到目的了,现在来说说这公式都是啥吧。
    先看公式(5),该公式的意思就是如果此像素邻域的方差和均值两者都在一个范围内,那么我们将此像素的值乘上一个系数C,否则该点像素保持与原图像素相等。

再次说下我们的目的。
首先我们要将对比度低区域找出来,怎么找呢?我们需要一个比较!我们知道方差体现了一个区域内数值的差距大小,若该区域亮度值相等,则方差为0,而对比度较低区域的方差通常也很小。我们用前面设置的3x3邻域遍历整张图片的每一个像素值,每一次都求一次方差和均值。

红色框是左上角方块中隐藏图案;黄色框是该邻域未接近隐藏图案;蓝色框是邻域进入隐藏图案

我们先算出红色框的均值和标准差分别为:35.4,5.5。再算出蓝色框的均值和方差:39.9,4.4。随着邻域进入隐藏图案,方差也会越来越小,我们是否可以用刚进入邻域的方差作为一个阈值呢?只有当该点(c,d)邻域方差小于这个阈值时,我们才提高该点(c,d)的亮度。因此我们k3,即方差最大值可以选择(4.4/原图标准差)。因此,在我们进行遍历的时候,均值在进入区域也会变大。如果方差小于k3时,我们就要将该点像素提高。如何提高呢?这就是系数C的作用了。k2的取值通常为0,因为因此图案中也有方差为0的地方。

系数C的定义就是(max(原图) / max(邻域)),目的就是提高对比度低区域(隐藏图案)的亮度。假设原图最高亮度是200,该邻域最高亮度为20,则200/20=10,我们乘10后,隐藏图案该像素值就会变亮,但不会超过全图最高亮度。

这样我们能够找到对比度较低的地方并处理,但是均值是干嘛的呢?

左边对应原图中的白色区域,右图对应原图黑色区域。

我们可以看到无论白色还是黑色区域,区域内亮度值基本相同,如果用方差判断的话他们也会被认定为低对比度区域。但是我们通过求两部分均值:230,32。再跟前面的均值对比,发现不是比目标区域的低就是高。因此我们可以通过均值大小来更加精准的来判断是否为隐藏图像区域。只有均值和方差均满足条件时,才提高亮度。那么k1上线应该选择(隐藏区域最大均值/原图均值)。下限k0通常选择(隐藏区域边界最小均值/原图均值)。这样我们就过滤了黑色和白色区域。

通过公式(5),遍历整张图片,仅改变隐藏图案亮度,我们就会得到处理后的图片。

Matlab实现代码

clear;clc;
img_1 = imread('D:\design\localhist.jpg');
img_1 = rgb2gray(img_1);
img_1 = double(img_1);
[m1,n1] = size(img_1);
outp_img = zeros(m1,n1);
outp_img(1,:) = img_1(1,:);
outp_img(m1,:) = img_1(m1,:);
outp_img(:,1) = img_1(:,1);
outp_img(:,n1) = img_1(:,n1);
m = round(mean2(img_1));
var_img = var(img_1(:));
var_img = round(var_img .^ 0.5);
k0 = 0.21;k1 = 0.3 ;k2 = 0;k3 = 0.049;
max_img = max(max(img_1));
for i=2:m1-1 %方便起见从第二行开始遍历for j=2:n1-1mS = mean([img_1(i,j) img_1(i-1,j-1) img_1(i,j-1) img_1(i+1,j-1)...img_1(i-1,j) img_1(i+1,j) img_1(i-1,j+1) img_1(i,j+1) img_1(i+1,j+1)]);varS = var([img_1(i,j) img_1(i-1,j-1) img_1(i,j-1) img_1(i+1,j-1)...img_1(i-1,j) img_1(i+1,j) img_1(i-1,j+1) img_1(i,j+1) img_1(i+1,j+1)]) ^ 0.5;max_neibor = max(max([img_1(i,j) img_1(i-1,j-1) img_1(i,j-1) img_1(i+1,j-1)...img_1(i-1,j) img_1(i+1,j) img_1(i-1,j+1) img_1(i,j+1) img_1(i+1,j+1)]));C = round(max_img / max_neibor);if (k0 * m <= mS && mS <=k1 * m) && ...(k2 * var_img <= varS && varS <=k3 * var_img)  outp_img(i,j) = round(C * img_1(i,j));elseoutp_img(i,j) = img_1(i,j);endend
endimshow(uint8(outp_img)); 

不要喷我代码烂哦。。。 运行需要几秒钟,原因能是循环运算,希望大佬们可以提出一些优化的办法。

处理后的图像

总结

由于图像是从书中截图下来的,亮度和原图差距较大,比如原图中黑色部分为0,而截下来的图为30多。左下角的一条线没有显示出来,可能需要再调下参数,这个就留给你们了。

第一次发博客,也是当作自己的一个笔记,本文基本根据书中资料和自己的理解,一定有理解错误或不到位的地方,请多指教。我算是刚入门的图像处理,今年研一,正在学习中,希望与大家多交流交流~

<冈萨雷斯图像处理>局部直方图处理:直方图统计(Histogram Statistics)相关推荐

  1. oracle数据库直方图,[转] oracle统计信息(statistics)和直方图(histogram)

    oracle统计信息和直方图的理解 以前一直对统计信息的理解就是对行的数据分布的,提供改CBO来选择高效的执行计划.这段时间看了不少资料,对统计有了一个更清晰的认识 统计信息: 1,表中的统计信息 2 ...

  2. OpenCV与图像处理学习二——图像直方图与色彩空间

    OpenCV与图像处理学习二--图像直方图与色彩空间 2.4 图像直方图(Image Histogram) 2.4.1 直方图的绘制 2.4.2 三通道直方图绘制 2.5 颜色空间 2.5.1 RGB ...

  3. Matlab数字图像处理 02 灰度变化(图像直方图、直方图均衡化、直方图匹配)

    第二章 灰度变化 2.1 图像的亮度.对比度和动态范围 2.1.1 亮度 2.1.2 对比度 2.1.3 动态范围 2.2 线性灰度变换 2.2.1 具有饱和处理的线性灰度变换 2.2.2 分段线性灰 ...

  4. python绘制灰度图片直方图-opencv+python 统计及绘制直方图

    灰度直方图概括了图像的灰度级信息,简单的来说就是每个灰度级图像中的像素个数以及占有率,创建直方图无外乎两个步骤,统计直方图数据,再用绘图库绘制直方图. 统计直方图数据 首先要稍微理解一些与函数相关的术 ...

  5. OpenCV之imgproc 模块. 图像处理(4)直方图均衡化 直方图计算 直方图对比 反向投影 模板匹配

    直方图均衡化 目标 在这个教程中你将学到: 什么是图像的直方图和为什么图像的直方图很有用 用OpenCV函数 equalizeHist 对图像进行直方图均衡化 原理 图像的直方图是什么? 直方图是图像 ...

  6. Win8 Metro(C#)数字图像处理--3.3图像直方图计算

    原文:Win8 Metro(C#)数字图像处理--3.3图像直方图计算 /// <summary>/// Get the array of histrgram./// </summa ...

  7. 【图像处理】MATLAB:直方图

    直方图处理与函数绘图   基于从图像亮度直方图中提取的信息的亮度变换函数,在诸如增强.压缩.分割.描述等方面的图像处理中扮演者基础性的角色.本节旨在获取.绘图并利用直方图技术进行图像增强. 绘制直方图 ...

  8. 图像处理大型科普——图像直方图

    图像处理大型科普--图像直方图 偶尔跟在浙大读研的湖大一姐谈起轮廓识别,她正在做一个能把衣服分类成不同款式的应用,衣服平摊好,然后用手机一扫,马上就能告诉你这是T-SHIRT还是裙子,什么?你敢说这玩 ...

  9. R语言使用gganimate包可视化动画点直方图生成过程(dot histogram)、在数据遍历的过程中逐步在箱体内堆叠数据点形成最终的点直方图

    R语言使用gganimate包可视化动画点直方图生成过程(dot histogram).在数据遍历的过程中逐步在箱体内堆叠数据点形成最终的点直方图 目录

  10. seaborn使用axes_dict函数获取displot函数生成的图像所有标题信息、使用set_title函数自定义设置多面板直方图标题(Multi-panel histogram‘s title)

    seaborn使用axes_dict函数获取displot函数生成的图像所有标题信息.使用set_title函数自定义设置多面板直方图标题(Multi-panel histogram's title) ...

最新文章

  1. 安装部署中的数据库打包和快捷方式启动浏览器
  2. FOPEN FUNCTION
  3. pandas使用pad函数向dataframe特定数据列的每个字符串添加补齐字符或者字符串、向所有字符串的左右两侧填充、直到宽度达到指定要求(both padding)
  4. 淄博职业学院计算机应用,2019年淄博职业学院单独招生云计算技术与应用专业技能测试实施细则...
  5. 在Clojure中使用class
  6. 002_SpringIOC
  7. 『设计模式』反射,反射程序员的快乐!为什么我老是加班?为什么我工资不如他多?原来是我不懂反射!
  8. HDR 成像技术学习(一)
  9. Android 后台线程Thread调用前台线程Handler,延时线程,runOnUiThread使用,Timer延时,定时循环,倒计时
  10. 学 Python 最大的 1 个误区,看看你中招了吗?
  11. 算术移位的规则及逻辑移动的规则
  12. 评分组件(RatingBar)
  13. 你在闲鱼捡过最大的漏是什么?
  14. ubuntu17安装mysql后数据库乱码_linux安装MySQL数据库,设置编码为utf8
  15. Center Loss
  16. Mongodb语法学习:查询
  17. UG8.5中nxopen.dll等文件所在位置
  18. 那么多北漂程序员,到了35岁以后该怎么选择往后的路?
  19. 动态iptables 防火墙
  20. 计算机语言晦涩难懂? 别怕 我来C

热门文章

  1. 小白如何自学后端开发
  2. win7万能声卡驱动_我把一台PC的操作系统从win7换成了win10,它真的很棒!
  3. 可恢复保险丝的内部结构
  4. neo4j 最短路径 java_Neo4j查询节点间最短路径
  5. H5+实现保存图片到本地相册
  6. 破解Excel工作表密码
  7. 叶脊网络架构(Spine-Leaf)
  8. unity3D 自定义显示中文
  9. 会议室选多大尺寸的会议平板才合适?
  10. 使用可道云在centos上搭建个人网盘(附带端口修改)