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

匿名 (未验证) 提交于 2019-12-03 00:19:01
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)

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) 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!