图像处理(五)

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)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值