彩色图片直方图
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 None 4 256 5 0-255\n",
hist = cv2.calcHist([image],[0],None,[256],[0.0,255.0])
minV,maxV,minL,maxL = cv2.minMaxLoc(hist)
histImg = np.zeros([256,256,3],np.uint8)
for h in range(256):
intenNormal = int(hist[h]*256/maxV)
cv2.line(histImg,(h,256),(h,256-intenNormal),color)
cv2.imshow(windowName,histImg)
return histImg
img = cv2.imread('haha.png',1)
channels = cv2.split(img)# RGB - R G B\n",
for i in range(0,3):
ImageHist(channels[i],31+i)
cv2.waitKey(10000)
难以想象,这么一坨东西,就是我和我弟弟~
灰度均衡化
首先最重要的就是需要一张非常好看的自拍~~~
第二张图明显要更加亮一些。
import cv2
import numpy as np
img=cv2.imread('images/03.jpeg',1)
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
cv2.imshow('before',gray)
dst=cv2.equalizeHist(gray)
cv2.imshow('now',dst)
cv2.waitKey(10000)
彩色直方图均衡化
import cv2
import numpy as np
img=cv2.imread('images/03.jpeg',1)
cv2.imshow('before',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('now',result)
cv2.waitKey(10000)
YUV直方图均衡化
import cv2
import numpy as np
from grpc import Channel
img=cv2.imread('images/03.jpeg',1)
imgYUV =cv2.cvtColor(img,cv2.COLOR_BGR2YCrCb)
#这个函数很厉害 还可以将 RGB图片 转换为 YUV图片
cv2.imshow('before',img)
channelsYUV =cv2.split(imgYUV)
channelsYUV[0] =cv2.equalizeHist(channelsYUV[0])
channels= cv2.merge(channelsYUV)
#再把通道合并
result =cv2.cvtColor(channels,cv2.COLOR_YCrCb2BGR)
#YUV图片转换为RGB
cv2.imshow('now',channels)
cv2.waitKey(10000)
图片修补
既然图片需要修补,那么说明这张图片已经瓦特了,那么我们就像数学家一样思考问题,先把图片搞坏吧。
通过下面一些像素值的写入,图片已经被成功玩坏,并且,弄坏的是我弟弟的小脸蛋儿···哈哈哈哈哈
import cv2
import numpy as np
img=cv2.imread('images/03.jpeg',1)
for i in range(200,300):
img[i,300]=(255,255,255)
img[i,300+1]=(255,255,255)
img[i,300-1]=(255,255,255)
for i in range(250,350):
img[250,i]=(255,255,255)
img[250+1,i]=(255,255,255)
img[250+2,i]=(255,255,255)
cv2.imwrite('06.jpg',img)
cv2.imshow('now',img)
cv2.waitKey(10000)
然后我弟弟非常不开心,希望我帮他修补,没办法,谁让我是哥哥··
import cv2
import numpy as np
img=cv2.imread('images/06.jpg',1)
imgInfo=img.shape
height= imgInfo[0]
width=imgInfo[1]
paint =np.zeros((height,width,1),np.uint8)
#用for循环填充paint数组
for i in range(200,300):
paint [i,300]=255
paint [i,300+1]=255
paint[i,300-1]=255
for i in range(250,350):
paint[250,i]=255
paint[250+1,i]=255
paint[250+2,i]=255
cv2.imshow('paint ',paint)
#接下来图片修补
imgdst = cv2.inpaint(img,paint,3,cv2.INPAINT_TELEA)
cv2.imshow('now',imgdst)
cv2.waitKey(10000)
左边是paint数组的内容,右边是修补之后的照片…整体效果感觉还算ok,仔细看还是可以看出来差别的,不过也算可以了。弟弟又可以去撩妹了。
总结来说,这个功能和我想象的还是有点不一样。
灰度直方图源码
本质:统计每个像素灰度 出现的概率 0-255 P
import cv2
import numpy as np
import matplotlib.pyplot as plt
img=cv2.imread('images/03.jpeg',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
#遍历256个灰度等级
for i in range(0,255):
count[i] =count[i]/(height*width)
#matplot绘图
x= np.linspace(0,255,256)
y=count
plt.bar(x,y,0.9,alpha=1,color='b')
plt.show()
cv2.waitKey(10000)
彩色直方图源码
import cv2
import numpy as np
import matplotlib.pyplot as plt
img=cv2.imread('images/03.jpeg',1)
imgInfo=img.shape
height= imgInfo[0]
width=imgInfo[1]
countB= np.zeros(256,np.float)
countG= np.zeros(256,np.float)
countR= 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)
countB[index_b] =countB[index_b]+1
countG[index_b] =countG[index_g]+1
countR[index_b] =countR[index_r]+1
for i in range(0,256):
countB[i] = countB[i]/(height * width)
countG[i] = countG[i]/(height * width)
countR[i] = countR[i]/(height * width)
x= np.linspace(0,255,256) #x轴坐标
y1=countB
plt.bar(x,y1,0.9,alpha=1,color='b')
y2=countG
plt.bar(x,y2,0.9,alpha=1,color='g')
y3=countR
plt.bar(x,y3,0.9,alpha=1,color='r')
plt.show()
cv2.waitKey(10000)