下面那个是p(rk)是概率密度函数。

横坐标灰度等级,纵坐标是各个像素的个数。

直方图性质:

1.无空间信息

2.直方图与图像一对多关系(不同的图像可能有相同的直方图。)

3.可叠加性(全图与子图像),即图像可以由多个子图叠加而成

归一化:

因为目标函数是均匀的,所以P(s)=1,因为那个像素的个数是必定不为0的。

(运算时四舍五入)

eg:0.19在数值上离0.14近,所以安排到1/7处。

变化后基本均匀变化

可以看见均衡化后的图片天空出现了伪轮廓,因为变化时几个等级的灰度均衡化到一个灰度,另外几个灰度又均衡化到了另一个灰度,就会出现灰度差异明显的情况,即灰度的不连续变化,造成了天空的伪轮廓。

反变化:

several instances:

1.转换成负片效果(L-1-对应像素值)

# -*- coding:utf-8
import cv2 as cv
import numpy as np
from  matplotlib import pyplot as plt
img2 = np.zeros((256,256,3), np.uint8)#无符号八位整型,表示范围是[0, 255]的整数
img1 = cv.imread("/home/image/Pictures/lena256.jpg")#默认读取三通道
img2[:] = 255 - img1[:]#负片效果,对整个区间进行运算时,不用把三个:全写上,写一个也行imgcolor = cv.imread("/home/image/Pictures/bottle.png")
print(imgcolor.shape)
imgtemp = np.zeros((imgcolor.shape[0],imgcolor.shape[1],3),np.uint8)#不知道图片的尺寸时调用shape来初始化
(b,g,r) = cv.split(imgcolor)#CV是bgr的顺序,要转化成matplotlib的rgb顺序
imgcolor= cv.merge((r,g,b))
imgtemp[:,:,:] = 255 -imgcolor[:,:,:]
img =[img1,img2,imgcolor,imgtemp]
titles =['256-gary image','oppsite image','24-bit image ','opposite image']
for i in range(4):plt.subplot(1,4,i+1)plt.imshow(img[i])plt.yticks()plt.xticks()plt.title(titles[i])
plt.show()

运行结果如下:

输出bottle.jpg的尺寸


2.图像融合

dst = cv.addWeighted(src1, alpha, src2, beta,gamma, dst, dtype)

此函数的功能就是加权融合图像,每个像素点的像素是两种源图片的对应像素点的像素加权算出来的,融合公式如下:

dst = alpha*src1 + beta*src2 + gamma

参数说明:

src1:插入的第一个图片;
src2:插入的第二个图片;
alpha:double类型,加权系数,是src1图片的融合占比 ;
beta:double类型,加权系数,是src2图片的融合占比;
gamma:double类型,加权后图像的偏移量;
dst:输出图像;
dtype:默认为-1。

plt.imshow()的cmap(调色板)参数请refer to this article

# -*- coding:utf-8
# opencv read image is BGR channel,and matplot read is RGBimport cv2 as cv
from matplotlib import pyplot as plt
import  numpy as np# two images addweighted and simple add
imglena = cv.imread("/home/image/Pictures/lena512color.jpg")
(r,g,b)= cv.split(imglena)
img1 = cv.merge([b,g,r])#转换成rgb通道顺序
imgbaboon = cv.imread("/home/image/Pictures/baboon.jpg")
(r,g,b)= cv.split(imgbaboon)
img2 = cv.merge([b,g,r])#相加的两个图片尺寸必须一致img3 = cv.addWeighted(img1,0.6,img2,0.4,gamma=0)#第一幅图的权重是0.6,第二幅图的权重是0.4,偏移量为0
img4 = np.zeros(img3.shape,np.uint8)
img4[:,:,:] = img1[:,:,:] + img2[:,:,:]
images = [img1,img2,img3,img4]
titles = ['lena','baboon','maxture Image',' simple + Image']
for i in range(4):plt.subplot(2,2,i+1),plt.imshow(images[i],cmap='gray')#cmap就是调色板plt.title(titles[i])plt.xticks([]),plt.yticks([])
plt.show()

运行结果:

可看到第三个加权融合的图片中既能看到lena的影子又能看到狒狒的影子

而第四个直接相加的已经失真


3.直方图均衡化

先来看一下会用到的几个函数:

1.计算时间

getTickCount():用于返回从操作系统启动到当前所经的计时周期数,看名字也很好理解,get Tick Count(s)。

getTickFrequency():用于返回CPU的频率。get Tick Frequency。这里的单位是秒,也就是一秒内重复的次数。

即 总次数/一秒内重复的次数 = 时间(s)

2.绘制直方图

利用plt.hist()绘制直方图

参数interpret:

    matplotlib.pyplot.hist(  x, bins=10, range=None, normed=False,   weights=None, cumulative=False, bottom=None,   histtype=u'bar', align=u'mid', orientation=u'vertical',   rwidth=None, log=False, color=None, label=None, stacked=False,   hold=None, **kwargs)  

x : (n,) array or sequence of (n,) arrays

这个参数是指定每个bin(箱子)分布的数据,对应x轴

bins : integer or array_like, optional

这个参数指定bin(箱子)的个数,也就是总共有几条条状图

normed : boolean, optional

If True, the first element of the return tuple will be the counts normalized to form a probability density, i.e.,n/(len(x)`dbin)

这个参数指定密度,也就是每个条状图的占比例比,默认为1

color : color or array_like of colors or None, optional

这个指定条状图的颜色

3.numpy的高阶函数histogram()

想要看懂还是得先去看看上面的理论知识

戳这里

再康康这里

4.np.hstack()将参数元组的元素数组按水平方向进行叠加

form one array,但数组间的元素互不干扰。refer to this essay

# -*- coding:utf-8
# opencv read image is BGR channel,and matplot read is RGB
import cv2 as cv
import numpy as np
from matplotlib import pyplot as pltnames = "/home/image/Pictures/lena.jpg"
img = cv.imread(names,0)
(H,W)=img.shape#高(垂直长度),宽(水平长度)
pixel = H * Wdef display(files):cv.namedWindow("hist-imgs", 0)cv.resizeWindow("hist-imgs",3*W,H)cv.imshow("hist-imgs", np.hstack(files))def opencvdef(img):# opencv own's equlization functiont1 = cv.getTickCount()eq = cv.equalizeHist(img)#cv的直方图均衡函数t2 = cv.getTickCount()T1 = (t2 - t1) / cv.getTickFrequency()print("Opencv Histogram() Time consuming is ", T1,'second')files.append(eq)#加入列表#手动均衡化
def own(img):# bins is gray volume ,wide 0~255 ,hist is  every gray volume numberst1 =cv.getTickCount()hist,bins = np.histogram(img.flatten(), 256, [0, 255])LUT = np.zeros(256,np.uint8)LUT[0] =1.0 *hist[0] / pixel *255sumnums = hist[0]for i in range(1,256):#s[i]= sum of gray form 0 to isumnums =sumnums +hist[i]# LUT is equliztion array  = (255 X s[i])LUT[i] = np.uint8(1.0*sumnums /pixel *255)temps =np.zeros((H,W),np.uint8)for i in range(H ):for j in range(W ):temps[i,j] =LUT[img[i,j]]t2 = cv.getTickCount()T2 = (t2 - t1) / cv.getTickFrequency()print("Own Histogram() Time consuming is ", T2,'second')files.append(temps)pltshow(files)display(files)cv.waitKey(0)def pltshow(files):for i in range(3):plt.subplot(2,3,i+1),plt.imshow(files[i], cmap='gray', interpolation='bicubic')plt.xticks([]),plt.yticks([])#remove 刻度for i in range(3):hist, bins = np.histogram(files[i].flatten(), 256, [0, 255])plt.subplot(2,3,4+i)#flatten()将图像展开成一维数组plt.hist(files[i].flatten(),bins=256,range=[0,255],color='red')plt.xlim(0, 255),plt.ylim(0, hist.max()+1)#坐标轴范围,hist.max()即为所有像素的频数中最大的一个plt.show()if __name__ == '__main__':files =[img]opencvdef(img)own(img)

运行结果:

pltshow

display

4.直方图规定化

(1)numpy的cumsum函数解析戳这里

numpy.cumsum(a, axis=None, dtype=None, out=None)
axis=0,同一列的累加。
axis=1,同一行的累加。
axis不给定具体值,就把numpy数组当成一个一维数组。

(2)cv的calcHist函数和np的histogram函数等效,上次作业用过不多讲,戳这里也可查看示例代码

(3)cv.LUT函数解析戳这里

instance:

# -*- coding:utf-8
# opencv read image is BGR channel,and matplot read is RGBimport cv2 as cv
import numpy as np
import matplotlib.pyplot as plt#  Display image histogram
def showHist(src,name):plt.hist(src.ravel(), 256, [0, 256])plt.xlim(0, 255)plt.xlabel('DN'), plt.ylabel('count')plt.title(name+' histogram')plt.show()return#  Statistical image Cumulative frequency(累加频数)
def cumFre(src):# get image sizerows, cols = src.shape# get image histogram like (hist,bins = np.histogram(img.flatten(), 256, [0, 255]))等效hist = cv.calcHist([src], [0], None, [256], [0, 256])#频数# get image hist_add is formula sicumHist = np.cumsum(hist)#累加频数# Calculation of cumulative frequency of imagescumf = cumHist / (rows*cols)return cumf#  Histogram equalization
def histEq(src):rows, cols = src.shapehist = cv.calcHist([src], [0], None, [256], [0, 256])cumHist = np.cumsum(hist)LUT = np.zeros(256, np.float32)    #gary search sheetfor i in range(256):LUT[i] = 255.0/(rows*cols) * cumHist[i]LUT = np.uint8(LUT + 0.5)dst = cv.LUT(src, LUT)             # search sheetreturn dst# Histogram matching (image to be matched, reference image)
def histMatching(oriImage, refImage):oriCumHist = cumFre(oriImage)     #refCumHist = cumFre(refImage)     #lut = np.ones(256, dtype = np.uint8) * (256-1) #new search sheetstart = 0for i in range(256-1):temp = (refCumHist[i+1] - refCumHist[i]) / 2.0 + refCumHist[i]for j in range(start, 256):if oriCumHist[j] <= temp:lut[j] = ielse:start = jbreakdst = cv.LUT(oriImage, lut)return dstif __name__ == '__main__':#  Using this image histogram as a normalization template(规定化模板)refImg = cv.imread('/home/image/Pictures/house128.jpg', 0)# This is  a original imageoriImg = cv.imread('/home/image/Pictures/lena.jpg',0)showHist(refImg,'refImg')showHist(oriImg,'oriImg')# def function to nomaliztionoutImg = histMatching(oriImg, refImg)cv.imshow('original-Img is lena', oriImg)cv.namedWindow('reference- Img is house',cv.WINDOW_AUTOSIZE)cv.resizeWindow('reference- Img is house',(2*refImg.shape[0],2*refImg.shape[1]))cv.imshow('reference- Img is house', refImg)cv.imshow('output lena Img', outImg)cv.waitKey(0)cv.destroyAllWindows()

running consequence:

转化模板对比度鲜明

 

 

Image Histogram相关推荐

  1. poj 2559 Largest Rectangle in a Histogram 栈

    // poj 2559 Largest Rectangle in a Histogram 栈 // // n个矩形排在一块,不同的高度,让你求最大的矩形的面积(矩形紧挨在一起) // // 这道题用的 ...

  2. CUDA Samples: Calculate Histogram(atomicAdd)

    以下CUDA sample是分别用C++和CUDA实现的计算一维直方图,并对其中使用到的CUDA函数进行了解说,code参考了<GPU高性能编程CUDA实战>一书的第九章,各个文件内容如下 ...

  3. zw版【转发·台湾nvp系列Delphi例程】HALCON Histogram

    zw版[转发·台湾nvp系列Delphi例程]HALCON Histogram unit Unit1; interface uses Windows, Messages, SysUtils, Vari ...

  4. Python使用matplotlib可视化散点图、并在可视化图像的底部和右边添加边缘直方图、自定义边缘直方图的色彩(Marginal Histogram)

    Python使用matplotlib可视化散点图.并在可视化图像的底部和右边添加边缘直方图.自定义边缘直方图的色彩(Marginal Histogram) 目录

  5. python使用matplotlib可视化3D柱状图(3D histogram、三维柱状图、包含三个坐标轴x、y、z)、设置zdir参数为z、改变3d图观察的角度

    python使用matplotlib可视化3D柱状图(3D histogram.三维柱状图.包含三个坐标轴x.y.z).设置zdir参数为z.改变3d图观察的角度 目录

  6. R语言ggplot2可视化散点图(scatter plot)、并在可视化图像的顶部和右边添加边缘直方图(Marginal Histogram)、使用geom_smooth函数基于lm方法拟合数据点之间

    R语言ggplot2可视化散点图(scatter plot).并在可视化图像的顶部和右边添加边缘直方图(Marginal Histogram).使用geom_smooth函数基于lm方法拟合数据点之间 ...

  7. R语言单变量分析实战:汇总统计(Summary Statistics)、频率表(Frequency Table)、图表(charts: boxplot、histogram、density)

    R语言单变量分析实战:汇总统计(Summary Statistics).频率表(Frequency Table).图表(charts: boxplot.histogram.density) 目录

  8. python使用matplotlib可视化3D直方图(3D histogram、三维直方图、包含三个坐标轴x、y、z)、3D直方图可视化多个维度数据的区别和联系

    python使用matplotlib可视化3D直方图(3D histogram.三维直方图.包含三个坐标轴x.y.z).3D直方图可视化多个维度数据的区别和联系 目录

  9. python使用matplotlib可视化堆叠的直方图(stacked histogram plot)、多个类别的数据在直方图区间层面累积堆叠起来

    python使用matplotlib可视化堆叠的直方图(stacked histogram plot).多个类别的数据在直方图区间层面累积堆叠起来 目录

  10. R语言plotly可视化:plotly可视化累积cumulative直方图(Cumulative Histogram)

    R语言plotly可视化:plotly可视化累积cumulative直方图(Cumulative Histogram) 目录 R语言plotly可视化:plotly可视化累积cumulative直方图 ...

最新文章

  1. 在leangoo里怎么设置看板周期,过滤看板数据?
  2. Android -- 消息处理机制源码分析(Looper,Handler,Message)
  3. 常见的和端口,IP相关的企业面试题
  4. 深度学习(计算机视觉)面试中问题(二)
  5. 获取最大轮廓 opencv
  6. 放肆地使用UIBezierPath和CAShapeLayer画各种图形
  7. iOS开发Swift篇—(六)流程控制
  8. 使用BeetleX构建基础的SSL网络通讯
  9. vscode搜索文件_VS Code 新图标来临 —— 侧边栏、文件管理器、搜索、调试等区域的图标迎来全新设计...
  10. flatMap()与concatMap()与concatMapEager()– RxJava常见问题解答
  11. nodejs实践录:基于koa的简单web服务器
  12. 鸿蒙手机测试报名,鸿蒙2.0报名下载-鸿蒙2.0申请公测报名入口 v1.0-优盘手机站...
  13. python3+arcface2.0 离线人脸识别 demo
  14. 日志的打印 —— Java 支持
  15. onclick 事件
  16. GitHub 标星 8w!这个开源面试总结屌爆了!
  17. Detecting Deep-Fake Videos from Appearance and Behavior
  18. 中国量子计算机芯片美国,13nm!中国量子芯片再获突破,美国专家:中国学者不睡觉吗?...
  19. C·cJSON库函数--cJSON_GetObjectItem
  20. Java中jdk1.8和jdk17相互切换

热门文章

  1. vue动态绑定背景图片
  2. DAC0832数模转换芯片介绍及使用教程
  3. 基于matlab的MIMO信道容量仿真
  4. 扬州工业机器人外壳设计排名_扬州模型达人设计机器人获奖
  5. 计算机更改刷新频率,win10系统更改屏幕刷新频率的设置方案
  6. h5 android 重力 晃动,H5案例分享:html5重力感应事件(示例代码)
  7. Noah-MP陆面过程模型建模方法与站点、区域模拟实践技术应用
  8. 利用Mono-cecil实现.NET程序的重新签名,重新链接相关库的引用
  9. Jeffery Pinto和Om Kharbanda:项目经理的12项工作
  10. android恶意积分墙代码,传统积分墙的忧虑:微信积分墙刷榜优化分析