#初始化一個(gè)矩形np.max(marks)+1行,3列,默認(rèn)值為0
創(chuàng)新互聯(lián)公司是一家專注于網(wǎng)站建設(shè)、成都網(wǎng)站建設(shè)與策劃設(shè)計(jì),龍灣網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)10余年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:龍灣等地區(qū)。龍灣做網(wǎng)站價(jià)格咨詢:18982081108
colorTab?=?np.zeros((np.max(marks)+1,3))
#遍歷數(shù)組,給每行的3列賦值,就是RGB顏色值,8位的
for?i?in?range(len(colorTab)):
aa?=?np.random.uniform(0,255)
bb?=?np.random.uniform(0,255)
cc?=?np.random.uniform(0,255)
colorTab[i]?=?np.array([aa,bb,cc],np.uint8)
#初始化另一個(gè)跟img圖像形狀大小一樣的圖像,一副黑色圖像
bgrImage?=?np.zeros(img.shape,np.uint8)
#遍歷marks形狀的行列
for?i?in?range(marks.shape[0]):
for?j?in?range(marks.shape[1]):
index?=?marks[i][j]
#判斷是不是區(qū)域與區(qū)域之間的分界,如果是邊界(-1),則使用白色顯示
if?index?==?-1:
bgrImage[i][j]?=?np.array([255,255,255])?#像素點(diǎn)設(shè)置位白色
else:
bgrImage[i][j]?=?colorTab[index]????#像素點(diǎn)設(shè)置位上邊隨機(jī)生成的顏色值
#顯示處理后的圖像圖像
cv2.imshow('After?ColorFill',bgrImage)
#總結(jié),先生成一個(gè)跟marks相同數(shù)量的row*col的一張顏色表,然后創(chuàng)建一個(gè)跟marks相同大小的一副黑色圖像
#最后對(duì)黑色圖像畫出白色邊界和內(nèi)部隨機(jī)彩色像素值
圖像的二值化是將圖像上的像素點(diǎn)的灰度值設(shè)置為0或255,也就是將整個(gè)圖像呈現(xiàn)出明顯的黑白效果。
將256個(gè)亮度等級(jí)的灰度圖像通過適當(dāng)?shù)拈y值選取而獲得仍然可以反映圖像整體和局部特征的二值化圖像。在數(shù)字圖像處理中,二值圖像占有非常重要的地位,首先,圖像的二值化有利于圖像的進(jìn)一步處理,使圖像變得簡(jiǎn)單,而且數(shù)據(jù)量減小,能凸顯出感興趣的目標(biāo)的輪廓。其次,要進(jìn)行二值圖像的處理與分析,首先要把灰度圖像二值化,得到二值化圖像。
所有灰度大于或等于閥值的像素被判定為屬于特定物體,其灰度值為255表示,否則這些像素點(diǎn)被排除在物體區(qū)域以外,灰度值為0,表示背景或者例外的物體區(qū)域
一下程序可以實(shí)現(xiàn)圖像的二值化:
/**************************************
*
* 函數(shù)名:
* cvBinaryEx
* 參 數(shù):
* imgSrc - 進(jìn)行銳化的圖像
* 返回值:
* 成功銳化返回TRUE,否則返回false;
* 說 明:
*
* 對(duì)圖進(jìn)行二值化
*
************************************/
bool cvBinaryEx(IplImage *imgSrc)
{
IplImage* img = cvCreateImage(cvGetSize(imgSrc),imgSrc-depth,imgSrc-nChannels);
CvScalar s;
int sum=0;
for (int i=0; i imgSrc-height; i++)
{
? ? for (int j=0; j imgSrc-width; j++)
? ? {
? ? ? ? s =? cvGet2D(imgSrc,i,j);
? ? ? ? sum = (s.val[0]+s.val[1]+s.val[2])/3;
? ? ? if (sum 128)
? ? ? ? {
? ? ? ? ? ? s.val[0]=s.val[1]=s.val[2]=255;
? ? ? ? ? ? cvSet2D(imgSrc,i,j,s);
? ? ? ? }
? ? ? ? else
? ? ? ? {
? ? ? ? ? ? s.val[0]=s.val[1]=s.val[2]=0;
? ? ? ? ? ? cvSet2D(imgSrc,i,j,s);
}
}
}
return true;
}
灰度圖grayscale
灰度是指只含亮度信息,不含色彩信息的圖像。黑白照片就是灰度圖,特點(diǎn)是亮度由暗到明,變化是連續(xù)的。要表示灰度圖,就需要把亮度值進(jìn)行量化
使用灰度圖的好處:
①? ? RGB的值都一樣。
②? ? 圖像數(shù)據(jù)即調(diào)色板索引值,就是實(shí)際的RGB值,也就是亮度值。
③? ? 因?yàn)槭?56色調(diào)色板,所以圖像數(shù)據(jù)中一個(gè)字節(jié)代表一個(gè)像素,很整齊。
所以,做圖像處理時(shí)都采用灰度圖。
將一幅RGB格式的圖像轉(zhuǎn)化為灰度圖:
IplImage *src= cvLoadImage("C:\\home.bmp", -1);
IplImage *dest ;
cvCvtColor(Src, dest, CV_RGB2GRAY);
然后將灰度圖dest轉(zhuǎn)化為二值化圖像(保存在src中),可以直接使用cvThreshold函數(shù):
cvThreshold(dest, src, 1, 255, CV_THRESH_BINARY);
一般先將圖像灰度化,然后再二值化,然后在進(jìn)行邊緣處理等操作。。。
灰度化--二值化---邊緣提取
Python圖像處理是一種簡(jiǎn)單易學(xué),功能強(qiáng)大的解釋型編程語(yǔ)言,它有簡(jiǎn)潔明了的語(yǔ)法,高效率的高層數(shù)據(jù)結(jié)構(gòu),能夠簡(jiǎn)單而有效地實(shí)現(xiàn)面向?qū)ο缶幊蹋挛倪M(jìn)行對(duì)Python圖像處理進(jìn)行說明。
當(dāng)然,首先要感謝“戀花蝶”,是他的文章“用Python圖像處理 ” 幫我堅(jiān)定了用Python和PIL解決問題的想法,對(duì)于PIL的一些介紹和基本操作,可以看看這篇文章。我這里主要是介紹點(diǎn)我在使用過程中的經(jīng)驗(yàn)。
PIL可以對(duì)圖像的顏色進(jìn)行轉(zhuǎn)換,并支持諸如24位彩色、8位灰度圖和二值圖等模式,簡(jiǎn)單的轉(zhuǎn)換可以通過Image.convert(mode)函數(shù)完 成,其中mode表示輸出的顏色模式。例如''L''表示灰度,''1''表示二值圖模式等。
但是利用convert函數(shù)將灰度圖轉(zhuǎn)換為二值圖時(shí),是采用固定的閾 值127來實(shí)現(xiàn)的,即灰度高于127的像素值為1,而灰度低于127的像素值為0。為了能夠通過自定義的閾值實(shí)現(xiàn)灰度圖到二值圖的轉(zhuǎn)換,就要用到 Image.point函數(shù)。
深度剖析Python語(yǔ)法功能
深度說明Python應(yīng)用程序特點(diǎn)
對(duì)Python數(shù)據(jù)庫(kù)進(jìn)行學(xué)習(xí)研究
Python開發(fā)人員對(duì)Python經(jīng)驗(yàn)之談
對(duì)Python動(dòng)態(tài)類型語(yǔ)言解析
Image.point函數(shù)有多種形式,這里只討論Image.point(table, mode),利用該函數(shù)可以通過查表的方式實(shí)現(xiàn)像素顏色的模式轉(zhuǎn)換。其中table為顏色轉(zhuǎn)換過程中的映射表,每個(gè)顏色通道應(yīng)當(dāng)有256個(gè)元素,而 mode表示所輸出的顏色模式,同樣的,''L''表示灰度,''1''表示二值圖模式。
可見,轉(zhuǎn)換過程的關(guān)鍵在于設(shè)計(jì)映射表,如果只是需要一個(gè)簡(jiǎn)單的箝位值,可以將table中高于或低于箝位值的元素分別設(shè)為1與0。當(dāng)然,由于這里的table并沒有什么特殊要求,所以可以通過對(duì)元素的特殊設(shè)定實(shí)現(xiàn)(0, 255)范圍內(nèi),任意需要的一對(duì)一映射關(guān)系。
示例代碼如下:
import Image # load a color image im = Image.open(''fun.jpg'') # convert to grey level image Lim = im.convert(''L'') Lim.save(''fun_Level.jpg'') # setup a converting table with constant threshold threshold = 80 table = [] for i in range(256): if i threshold: table.append(0) else: table.append(1) # convert to binary image by the table bim = Lim.point(table, ''1'') bim.save(''fun_binary.jpg'')
IT部分通常要完成的任務(wù)相當(dāng)繁重但支撐這些工作的資源卻很少,這已經(jīng)成為公開的秘密。任何承諾提高編碼效率、降低軟件總成本的IT解決方案都應(yīng)該進(jìn)行 周到的考慮。Python圖像處理所具有的一個(gè)顯著優(yōu)勢(shì)就是可以在企業(yè)的軟件創(chuàng)建和維護(hù)階段節(jié)約大量資金,而這兩個(gè)階段的軟件成本占到了軟件整個(gè)生命周期中總成本 的50%到95%。
Python清晰可讀的語(yǔ)法使得軟件代碼具有異乎尋常的易讀性,甚至對(duì)那些不是最初接觸和開發(fā)原始項(xiàng)目的程序員都 能具有這樣的強(qiáng)烈感覺。雖然某些程序員反對(duì)在Python代碼中大量使用空格。
不過,幾乎人人都承認(rèn)Python圖像處理的可讀性遠(yuǎn)勝于C或者Java,后兩 者都采用了專門的字符標(biāo)記代碼塊結(jié)構(gòu)、循環(huán)、函數(shù)以及其他編程結(jié)構(gòu)的開始和結(jié)束。提倡Python的人還宣稱,采用這些字符可能會(huì)產(chǎn)生顯著的編程風(fēng)格差 異,使得那些負(fù)責(zé)維護(hù)代碼的人遭遇代碼可讀性方面的困難。轉(zhuǎn)載
import CV2
import copy
import numpy as np
import random
使用的是pycharm
因?yàn)樽罱戳恕躲y翼殺手2049》,里面Joi實(shí)在是太好看了所以原圖像就用Joi了
要求是灰度圖像,所以第一步先把圖像轉(zhuǎn)化成灰度圖像
# 讀入原始圖像
img = CV2.imread('joi.jpg')
# 灰度化處理
gray = CV2.cvtColor(img, CV2.COLOR_BGR2GRAY)
CV2.imwrite('img.png', gray)
第一個(gè)任務(wù)是利用分段函數(shù)增強(qiáng)灰度對(duì)比,我自己隨便寫了個(gè)函數(shù)大致是這樣的
def chng(a):
if a 255/3:
b = a/2
elif a 255/3*2:
b = (a-255/3)*2 + 255/6
else:
b = (a-255/3*2)/2 + 255/6 +255/3*2
return b
rows = img.shape[0]
cols = img.shape[1]
cover = copy.deepcopy(gray)
for i in range(rows):
for j in range(cols):
cover[i][j] = chng(cover[i][j])
CV2.imwrite('cover.png', cover)
下一步是直方圖均衡化
# histogram equalization
def hist_equal(img, z_max=255):
H, W = img.shape
# S is the total of pixels
S = H * W * 1.
out = img.copy()
sum_h = 0.
for i in range(1, 255):
ind = np.where(img == i)
sum_h += len(img[ind])
z_prime = z_max / S * sum_h
out[ind] = z_prime
out = out.astype(np.uint8)
return out
covereq = hist_equal(cover)
CV2.imwrite('covereq.png', covereq)
在實(shí)現(xiàn)濾波之前先添加高斯噪聲和椒鹽噪聲(代碼來源于網(wǎng)絡(luò))
不知道這個(gè)椒鹽噪聲的名字是誰(shuí)起的感覺隔壁小孩都饞哭了
用到了random.gauss()
percentage是噪聲占比
def GaussianNoise(src,means,sigma,percetage):
NoiseImg=src
NoiseNum=int(percetage*src.shape[0]*src.shape[1])
for i in range(NoiseNum):
randX=random.randint(0,src.shape[0]-1)
randY=random.randint(0,src.shape[1]-1)
NoiseImg[randX, randY]=NoiseImg[randX,randY]+random.gauss(means,sigma)
if NoiseImg[randX, randY] 0:
NoiseImg[randX, randY]=0
elif NoiseImg[randX, randY]255:
NoiseImg[randX, randY]=255
return NoiseImg
def PepperandSalt(src,percetage):
NoiseImg=src
NoiseNum=int(percetage*src.shape[0]*src.shape[1])
for i in range(NoiseNum):
randX=random.randint(0,src.shape[0]-1)
randY=random.randint(0,src.shape[1]-1)
if random.randint(0,1)=0.5:
NoiseImg[randX,randY]=0
else:
NoiseImg[randX,randY]=255
return NoiseImg
covereqg = GaussianNoise(covereq, 2, 4, 0.8)
CV2.imwrite('covereqg.png', covereqg)
covereqps = PepperandSalt(covereq, 0.05)
CV2.imwrite('covereqps.png', covereqps)
下面開始均值濾波和中值濾波了
就以n x n為例,均值濾波就是用這n x n個(gè)像素點(diǎn)灰度值的平均值代替中心點(diǎn),而中值就是中位數(shù)代替中心點(diǎn),邊界點(diǎn)周圍補(bǔ)0;前兩個(gè)函數(shù)的作用是算出這個(gè)點(diǎn)的灰度值,后兩個(gè)是對(duì)整張圖片進(jìn)行
#均值濾波模板
def mean_filter(x, y, step, img):
sum_s = 0
for k in range(x-int(step/2), x+int(step/2)+1):
for m in range(y-int(step/2), y+int(step/2)+1):
if k-int(step/2) 0 or k+int(step/2)+1 img.shape[0]
or m-int(step/2) 0 or m+int(step/2)+1 img.shape[1]:
sum_s += 0
else:
sum_s += img[k][m] / (step*step)
return sum_s
#中值濾波模板
def median_filter(x, y, step, img):
sum_s=[]
for k in range(x-int(step/2), x+int(step/2)+1):
for m in range(y-int(step/2), y+int(step/2)+1):
if k-int(step/2) 0 or k+int(step/2)+1 img.shape[0]
or m-int(step/2) 0 or m+int(step/2)+1 img.shape[1]:
sum_s.append(0)
else:
sum_s.append(img[k][m])
sum_s.sort()
return sum_s[(int(step*step/2)+1)]
def median_filter_go(img, n):
img1 = copy.deepcopy(img)
for i in range(img.shape[0]):
for j in range(img.shape[1]):
img1[i][j] = median_filter(i, j, n, img)
return img1
def mean_filter_go(img, n):
img1 = copy.deepcopy(img)
for i in range(img.shape[0]):
for j in range(img.shape[1]):
img1[i][j] = mean_filter(i, j, n, img)
return img1
完整main代碼如下:
if __name__ == "__main__":
# 讀入原始圖像
img = CV2.imread('joi.jpg')
# 灰度化處理
gray = CV2.cvtColor(img, CV2.COLOR_BGR2GRAY)
CV2.imwrite('img.png', gray)
rows = img.shape[0]
cols = img.shape[1]
cover = copy.deepcopy(gray)
for i in range(rows):
for j in range(cols):
cover[i][j] = chng(cover[i][j])
CV2.imwrite('cover.png', cover)
covereq = hist_equal(cover)
CV2.imwrite('covereq.png', covereq)
covereqg = GaussianNoise(covereq, 2, 4, 0.8)
CV2.imwrite('covereqg.png', covereqg)
covereqps = PepperandSalt(covereq, 0.05)
CV2.imwrite('covereqps.png', covereqps)
meanimg3 = mean_filter_go(covereqps, 3)
CV2.imwrite('medimg3.png', meanimg3)
meanimg5 = mean_filter_go(covereqps, 5)
CV2.imwrite('meanimg5.png', meanimg5)
meanimg7 = mean_filter_go(covereqps, 7)
CV2.imwrite('meanimg7.png', meanimg7)
medimg3 = median_filter_go(covereqg, 3)
CV2.imwrite('medimg3.png', medimg3)
medimg5 = median_filter_go(covereqg, 5)
CV2.imwrite('medimg5.png', medimg5)
medimg7 = median_filter_go(covereqg, 7)
CV2.imwrite('medimg7.png', medimg7)
medimg4 = median_filter_go(covereqps, 7)
CV2.imwrite('medimg4.png', medimg4)
方法一:在使用OpenCV讀取圖片的同時(shí)將圖片轉(zhuǎn)換為灰度圖:
img = cv2.imread(imgfile, cv2.IMREAD_GRAYSCALE)
print("cv2.imread(imgfile, cv2.IMREAD_GRAYSCALE)結(jié)果如下:")
print('大小:{}'.format(img.shape))
print("類型:%s"%type(img))
print(img)
運(yùn)行結(jié)果如下圖所示:
方法二:使用OpenCV,先讀取圖片,然后在轉(zhuǎn)換為灰度圖:
img = cv2.imread(imgfile)
#print(img.shape)
#print(img)
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #Y = 0.299R + 0.587G + 0.114B
print("cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)結(jié)果如下:")
print('大小:{}'.format(gray_img.shape))
print("類型:%s" % type(gray_img))
print(gray_img)
運(yùn)行結(jié)果如下:
方法三:使用PIL庫(kù)中的Image模塊:
img = np.array(Image.open(imgfile).convert('L'), 'f') #讀取圖片,灰度化,轉(zhuǎn)換為數(shù)組,L = 0.299R + 0.587G + 0.114B。'f'為float類型
print("Image方法的結(jié)果如下:")
print('大小:{}'.format(img.shape))
print("類型:%s" % type(img))
print(img)
圖像的灰度處理:
CV_LOAD_IMAGE_GRAYSCALE,這是最簡(jiǎn)單之間的辦法,在加載圖像時(shí)直接處理
IplImage* Igray=cvLoadImage("test.jpg",CV_LOAD_IMAGE_GRAYSCALE);
得到的圖像就是單通道的,也能夠用這個(gè)函數(shù):CVAPI(void) cvCvtColor( const CvArr* src, CvArr* dst, int code );
code=CV_BGR2GRAY;
opencv還提供了非常多方式,我這邊就不一一舉例了。
網(wǎng)站欄目:灰度化函數(shù)python 灰度化處理方法
當(dāng)前地址:http://www.chinadenli.net/article48/dodcjep.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃、標(biāo)簽優(yōu)化、外貿(mào)網(wǎng)站建設(shè)、做網(wǎng)站、網(wǎng)頁(yè)設(shè)計(jì)公司、小程序開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)