1、彩色直方图
# 彩色直方图
import cv2
import numpy as np
def imagehist(image,type):
color=(255,255,255)
windowName='Gray'
if type==31:
color=(255,0,0)
windowName='B hist'
elif type==32:
color=(0,255,0)
windowName='G hist'
elif type==33:
color=(0,0,255)
windowName='R hist'
# 1 image 2 直方图通道 [0]灰度 3 mask蒙版 4 直方图size 5 直方图中各个像素的值
hist=cv2.calcHist([image],[0],None,[256],[0.0,255.0])
minV,maxV,minL,maxL=cv2.minMaxLoca(hist) # 获得最大值最小值 以及最大值最小值索引
histimage=np.zeros([256,256,3],np.uint8)
for h in range(256):
internormal=int(hist[h]*256/maxV)
cv2.line(histimage,(h,256),(h,256-internormal),color)
cv2.imshow(windowName,histimage)
return histimage
img=cv2.imread('image1.jpg',1)
channels=cv2.split(img) # 分解 RGB ->R G B
for i in range(0,3):
imagehist(channels[i],31+i)
cv2.waitKey(0)
# 彩色直方图均衡化(api)
import cv2
import numpy as np
img=cv2.imread('image1.jpg',1)
cv2.imshow('src',img)
(b,g,r)=cv2.split(img)
bH=cv2.equalizeHist(b)
gH=cv2.equalizeHist(g)
rH=cv2.equalizeHist(r)
result=cv2.merge((bH,gH,rH))
cv2.imshow('dst',result)
cv2.waitKey(0)
彩色直方图实现代码
import cv2
import numpy as np
import matplotlib.pyplot as plt
img=cv2.imread('image1.jpg',1)
imginfo=img.shape
height=imginfo[0]
width=imginfo[1]
count_b=np.zeros(256,np.float)
count_g=np.zeros(256,np.float)
count_r=np.zeros(256,np.float)
for i in range(0,height):
for j in range(0,width):
(b,g,r)=img[i,j]
index_b=int(b)
index_g=int(g)
index_r=int(r)
count_b[index_b]=count_b[index_b]+1
count_g[index_g]=count_g[index_g]+1
count_r[index_r]=count_r[index_r]+1
for i in range(0,255):
count_b[i]=count_b[i]/(height*width)
count_g[i]=count_g[i]/(height*width)
count_r[i]=count_r[i]/(height*width)
x=np.linspace(0,255,256)
y1=count_b
plt.bar(x,y1,0.9,alpha=1,color='b')
y2=count_g
plt.bar(x,y2,0.9,alpha=1,color='g')
y3=count_r
plt.bar(x,y3,0.9,alpha=1,color='r')
plt.show()
cv2.waitKey(0)
彩色图像均衡化代码实现
# 本质:统计每隔像素出现的概率 0-255
# 累计概率
# 1 0.2 0.2
# 2 0.3 0.5
# 3 0.1 0.6
# 256
# 100 0.5 255*0.5 =new
import cv2
import numpy as np
import matplotlib.pyplot as plt
img=cv2.imread('image1.jpg',1)
cv2.imshow('src',img)
imginfo=img.shape
height=imginfo[0]
width=imginfo[1]
count_b=np.zeros(256,np.float)
count_g=np.zeros(256,np.float)
count_r=np.zeros(256,np.float)
for i in range(0,height):
for j in range(0,width):
(b,g,r)=img[i,j]
index_b=int(b)
index_g=int(g)
index_r=int(r)
count_b[index_b]=count_b[index_b]+1
count_g[index_g]=count_g[index_g]+1
count_r[index_r]=count_r[index_r]+1
for i in range(0,255):
count_b[i]=count_b[i]/(height*width)
count_g[i]=count_g[i]/(height*width)
count_r[i]=count_r[i]/(height*width)
# 计算累计概率
sum1_b=float(0)
sum1_g=float(0)
sum1_r=float(0)
for i in range(0,255):
sum1_b=sum1_b+count_b[i]
sum1_g=sum1_g+count_g[i]
sum1_r=sum1_r+count_r[i]
count_b[i]=sum1_b
count_g[i]=sum1_g
count_r[i]=sum1_r
# print(count)
# 计算映射表
map1_b=np.zeros(256,np.uint16)
map1_g=np.zeros(256,np.uint16)
map1_r=np.zeros(256,np.uint16)
for i in range(0,256):
map1_b[i]=np.uint16(count_b[i]*255)
map1_g[i]=np.uint16(count_g[i]*255)
map1_r[i]=np.uint16(count_r[i]*255)
# 映射
dst=np.zeros((height,width,3),np.uint8)
for i in range(0,height):
for j in range(0,width):
(b,g,r)=img[i,j]
b=map1_b[b]
g=map1_g[g]
r=map1_r[r]
dst[i,j]=(b,g,r)
cv2.imshow('dst',dst)
cv2.waitKey(0)
2.灰色直方图 均衡化
# 灰度 直方图均衡化
import cv2
import numpy as np
img=cv2.imread('image1.jpg',1)
gray=cv2.cvtColor(img,cv2.COLOR_BGR2RGBA)
cv2.imshow('src',gray)
dst=cv2.equalizeHist(gray)
cv2.imshow('dst',dst)
cv2.waitKey(0)
灰色直方图实现代码
import cv2
import numpy as np
import matplotlib.pyplot as plt
img=cv2.imread('image1.jpg',1)
imginfo=img.shape
height=imginfo[0]
width=imginfo[1]
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
count=np.zeros(256,np.float)
for i in range(0,height):
for j in range(0,width):
pixel=gray[i,j]
index=int(pixel)
count[index]=count[index]+1
for i in range(0,255):
count[i]=count[i]/(height*width)
x=np.linspace(0,255,256)
y=count
plt.bar(x,y,0.9,alpha=1,color='g')
plt.show()
cv2.waitKey(0)
灰色直方图均衡化代码
# 本质:统计每隔像素出现的概率 0-255
# 累计概率
# 1 0.2 0.2
# 2 0.3 0.5
# 3 0.1 0.6
# 256
# 100 0.5 255*0.5 =new
import cv2
import numpy as np
import matplotlib.pyplot as plt
img=cv2.imread('image1.jpg',1)
cv2.imshow('src',img)
imginfo=img.shape
height=imginfo[0]
width=imginfo[1]
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
count=np.zeros(256,np.float)
for i in range(0,height):
for j in range(0,width):
pixel=gray[i,j]
index=int(pixel)
count[index]=count[index]+1
for i in range(0,255):
count[i]=count[i]/(height*width)
# 计算累计概率
sum1=float(0)
for i in range(0,255):
sum1=sum1+count[i]
count[i]=sum1
# print(count)
# 计算映射表
map1=np.zeros(256,np.uint16)
for i in range(0,256):
map1[i]=np.uint16(count[i]*255)
# 映射
for i in range(0,height):
for j in range(0,width):
pixel=gray[i,j]
gray[i,j]=map1[pixel]
cv2.imshow('dst',gray)
cv2.waitKey(0)