05-图像的美化
一、彩色圖片直方圖
cv2.calcHist([image],[0],None,[256],[0.0,255.0])
該方法的所有參數(shù)都必須用中括號(hào)括起來(lái)!!!
參數(shù)一:傳入的圖片數(shù)據(jù)
參數(shù)二:用于計(jì)算直方圖的通道,這里使用的是灰度直方圖,所以就使用第一個(gè)通道,第一個(gè)通道下標(biāo)是0
參數(shù)三:mask模板,這里沒(méi)有用,所以給個(gè)None
參數(shù)四:直方圖的橫坐標(biāo)尺度size,表明直方圖分成多少份,或有多少個(gè)柱狀;256表示0-255總共256個(gè)灰度值
參數(shù)五:直方圖中各個(gè)像素的值0.0-255.0表明從0.0開始已知到255.0所以的像素都進(jìn)行遍歷,因?yàn)榛叶戎抵荒苁?-255之內(nèi)
cv2.minMaxLoc(hist)
計(jì)算當(dāng)前hist這個(gè)直方圖中的最小值、最大值、最小值對(duì)應(yīng)的下標(biāo)和最大值對(duì)應(yīng)的下標(biāo)
cv2.split(img)
圖像分解,將彩色圖片的RGB分解為R G B三個(gè)通道
效果圖如下:
二、直方圖均衡化
灰度圖片的直方圖均衡化
cv2.equalizeHist(gray)
灰度圖的均衡化方法,只需要傳入一個(gè)灰度圖即可,其實(shí)針對(duì)的是一個(gè)顏色通道,若是彩色圖片有三個(gè)顏色通道需要分三次進(jìn)行均衡化
效果圖如下(左原圖,右均衡化圖片):
彩色圖片的直方圖均衡化
cv2.split(img)
圖像分解,將彩色圖片的RGB分解為R G B三個(gè)通道
cv2.merge((bH,gH,rH))
將單一的顏色通道進(jìn)行合成到一起
效果圖如下(左原圖,右均衡化圖片):
YUV圖像的直方圖均衡化
yuv是一種類似rgb的顏色模型,起源于黑白和彩電的過(guò)渡時(shí)期。
其中Y代表亮度,uv組合起來(lái)可以表示色度。
yuv信息只有y的信息就足以顯示黑白的圖片,
yuv和YCbCr表示相同的東西,且Cb嚴(yán)格對(duì)應(yīng)U,Cr嚴(yán)格對(duì)應(yīng)V
cv2.split(imgYUV)
圖像分解,將彩色圖片的RGB分解為R G B三個(gè)通道
cv2.equalizeHist(channelYUV[0])
對(duì)第一個(gè)顏色通道拿出來(lái)進(jìn)行均衡化
cv2.merge(channelYUV)
將單一的顏色通道進(jìn)行合成到一起
效果圖如下(左原圖,右均衡化圖片):
三、圖片修補(bǔ)
cv2.inpaint(img,paint,3,cv2.INPAINT_TELEA)
參數(shù)一:毀壞的圖片
參數(shù)二:修復(fù)的內(nèi)容部分,mask模板
參數(shù)三:修復(fù)圖片的線條粗細(xì)值。由于毀壞圖片的時(shí)候進(jìn)行的三個(gè)像素格的毀壞,故這里修復(fù)的線條粗細(xì)值為3
參數(shù)四:圖片修復(fù)類型
對(duì)一張圖片進(jìn)行毀壞,并保存,這里使用的是改變圖片中某位置的像素值從而達(dá)到毀壞圖片的目的
import cv2 import numpy as np img = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',1) for i in range(200,300):#對(duì)圖片進(jìn)行畫線進(jìn)行毀壞img[i,200] = (255,255,255)img[i,200+1] = (255,255,255)img[i,200-1] = (255,255,255) for i in range(150,250):#對(duì)圖片進(jìn)行畫線進(jìn)行毀壞img[250,i] = (255,255,255)img[250+1,i] = (255,255,255)img[250-1,i] = (255,255,255)cv2.imwrite('E:\Jupyter_workspace\study\data/damaged.jpg',img)#保存一下毀壞的圖片 cv2.imshow('image',img) cv2.waitKey(0)效果圖如下:
對(duì)毀壞的圖片進(jìn)行制作修復(fù)模板mask來(lái)修復(fù)圖片
效果圖如下(左毀壞圖片,中修復(fù)模板mask掩模,右修復(fù)過(guò)后的圖片):
四、灰度直方圖源碼
灰度直方圖的本質(zhì):統(tǒng)計(jì)每個(gè)像素灰度值出現(xiàn)的概率0-255
import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread('E:\Jupyter_workspace\study/w1.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='r') plt.show() cv2.waitKey(0)效果圖如下:
五、彩色直方圖源碼
彩色直方圖的本質(zhì):分別統(tǒng)計(jì)每個(gè)顏色通道上的像素值出現(xiàn)的概率0-255
import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread('E:\Jupyter_workspace\study/w1.jpg',1) imgInfo = img.shape height = imgInfo[0] width = imgInfo[1]#對(duì)每個(gè)顏色通道上的像素值進(jìn)行統(tǒng)計(jì) 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]#圖片的像素值信息讀取到元組(b,g,r)中index_b = int(b)#將像素值轉(zhuǎn)換為int類型便于統(tǒng)計(jì)index_g = int(g)index_r = int(r)count_b[index_b] = count_b[index_b]+1#實(shí)現(xiàn)blue這個(gè)顏色通道上的像素的統(tǒng)計(jì)count_g[index_g] = count_g[index_g]+1count_r[index_r] = count_r[index_r]+1 for i in range(0,256):#遍歷每一個(gè)像素等級(jí)count_b[i] = count_b[i]/(height*width)#對(duì)像素值出現(xiàn)的個(gè)數(shù)進(jìn)行歸一化處理count_g[i] = count_g[i]/(height*width)count_r[i] = count_r[i]/(height*width) x = np.linspace(0,255,256)#從0開始,到255結(jié)束,一共256個(gè) y1 = count_b plt.figure() plt.bar(x,y1,0.9,alpha=1,color='b')#繪制blue顏色通道的柱狀圖 y2 = count_g plt.figure() plt.bar(x,y2,0.9,alpha=1,color='g') y3 = count_r plt.figure() plt.bar(x,y3,0.9,alpha=1,color='r') plt.show() cv2.waitKey(0)效果圖如下:
六、灰度直方圖均衡化
本質(zhì):統(tǒng)計(jì)每個(gè)像素灰度 出現(xiàn)的概率 0-255
累計(jì)概率
| 1 | 0.2 | 0.1 |
| 2 | 0.3 | 0.5=0.2+0.3 |
| 3 | 0.1 | 0.6=0.2+0.3+0.1 |
總共256個(gè)灰度等級(jí),每個(gè)灰度等級(jí)都會(huì)有一個(gè)出現(xiàn)概率,也都會(huì)有一個(gè)累積概率
灰度等級(jí)(100),累積概率(0.5),100到這個(gè)新值之間的映射(2550.5),以后所有的100等級(jí)這個(gè)像素都使用2550.5進(jìn)行替代,替代完成之后就是直方圖的均衡化
import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',1) #cv2.imshow('img',img)imgInfo = img.shape height = imgInfo[0] width = imgInfo[1] gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) cv2.imshow('gray',gray) 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) #計(jì)算累計(jì)概率 sum1 = float(0) for i in range(0,256):sum1 = sum1+count[i]count[i] = sum1 #print(count) # 計(jì)算映射表 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)效果圖如下:
七、彩色直方圖均衡化
import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',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]+1count_g[index_g] = count_g[index_g]+1count_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) #計(jì)算累計(jì)概率 sum_b = float(0) sum_g = float(0) sum_r = float(0) for i in range(0,256):sum_b = sum_b+count_b[i]sum_g = sum_g+count_g[i]sum_r = sum_r+count_r[i]count_b[i] = sum_bcount_g[i] = sum_gcount_r[i] = sum_r #print(count) # 計(jì)算映射表 map_b = np.zeros(256,np.uint16) map_g = np.zeros(256,np.uint16) map_r = np.zeros(256,np.uint16) for i in range(0,256):map_b[i] = np.uint16(count_b[i]*255)map_g[i] = np.uint16(count_g[i]*255)map_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 = map_b[b]g = map_g[g]r = map_r[r]dst[i,j] = (b,g,r) cv2.imshow('dst',dst) cv2.waitKey(0)效果圖如下:
八、亮度增強(qiáng)
實(shí)現(xiàn)思路:在原來(lái)的亮度基礎(chǔ)上+40,從而達(dá)到亮度增強(qiáng)的效果
import cv2 import numpy as np img = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',1) imgInfo = img.shape height = imgInfo[0] width = imgInfo[1] cv2.imshow('src',img) 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]bb = int(b)+40gg = int(g)+40rr = int(r)+40if bb>255:bb = 255if gg>255:gg = 255if rr>255:rr = 255dst[i,j] = (bb,gg,rr) cv2.imshow('dst',dst) cv2.waitKey(0)效果圖如下:
當(dāng)然也可以改變顏色通道乘以一個(gè)比例系數(shù)再加上一個(gè)常數(shù)的方法實(shí)現(xiàn)美白效果
例如:(b1.3)+10、(g1.2)+15、r不變
效果圖如下:
九、磨皮美白
調(diào)用API雙邊濾波
雙邊濾波:高斯濾波核g+距離核r,進(jìn)行加權(quán)算出一個(gè)共同的核p,并用當(dāng)前的和乘以像素,與像素進(jìn)行卷積,就可以得到一個(gè)新的像素,這個(gè)新的像素就是經(jīng)過(guò)雙邊濾波后的像素
效果圖如下:
十、高斯、均值濾波
濾波0的本質(zhì):矩陣對(duì)應(yīng)點(diǎn)相乘并求和
右邊是卷積核,為啥成1/16,是因?yàn)檫@個(gè)卷積元素之和為16,而且這個(gè)卷積核越中間值越大,越兩邊值越小
高斯濾波使用API的方式進(jìn)行調(diào)用
import cv2 import numpy as np img = cv2.imread('E:\Jupyter_workspace\study\data/test1.png',1) cv2.imshow('src',img) dst = cv2.GaussianBlur(img,(5,5),1.5) cv2.imshow('dst',dst) cv2.waitKey(0)效果圖如下:
均值濾波使用源碼方式進(jìn)行調(diào)用(為了防止溢出,圖像邊緣并進(jìn)行處理)
首先定義一個(gè)模板,比如66的模板,數(shù)據(jù)全為1,用這個(gè)全為1的模板數(shù)據(jù) 乘以 一個(gè)66矩陣中的所有的數(shù)據(jù),乘完之后再除以36,這樣便得到一個(gè)均值,把這個(gè)均值替換掉原來(lái)的像素值,則實(shí)現(xiàn)均值濾波效果
效果圖如下:
十一、中值濾波
算法思路:假如定義一個(gè)3*3的模板,這個(gè)模板中一共有9個(gè)像素,將這9個(gè)像素進(jìn)行排序,排序之后選擇中間的那個(gè)像素值去代替其他像素值
import cv2 import numpy as np img = cv2.imread('E:\Jupyter_workspace\study\data/test1.png',1) imgInfo = img.shape height = imgInfo[0] width = imgInfo[1] img = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY) cv2.imshow('src',img) dst = np.zeros((height,width,3),np.uint8) collect = np.zeros(9,np.uint8) for i in range(1,height-1):for j in range(1,width-1):k = 0for m in range(-1,2):#-1 0 1for n in range(-1,2):gray = img[i+m,j+n]collect[k] = grayk = k+1for k in range(0,9):#冒泡排序,從前往后比較,每輪比較選出最大值放到最后面p1 = collect[k]for t in range(k+1,9):if p1<collect[t]:mid = collect[t]collect[t] = p1p1 = middst[i,j] = collect[4]#該值就是中間值,用中間值去代替所有的像素值 cv2.imshow('dst',dst) cv2.waitKey(0)效果圖如下:
總結(jié)
- 上一篇: 游颐和园需要多长时间
- 下一篇: 摩尔庄园手游研究院怎么升级