基于OpenCV的计算机视觉入门(5)图像美化(上)

彩色图片直方图

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)

这里写图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值