生成一張純色的圖片
在昌邑等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作 網(wǎng)站設(shè)計(jì)制作定制網(wǎng)站,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),全網(wǎng)整合營銷推廣,成都外貿(mào)網(wǎng)站制作,昌邑網(wǎng)站建設(shè)費(fèi)用合理。
先設(shè)置圖片的顏色,接著利用Image模塊的new方法新生成一張圖片,png格式的圖片需要設(shè)置成rgba,類似的還有rgb,L(灰度圖等),尺寸設(shè)定為640,480,這個(gè)可以根據(jù)自己的情況設(shè)定,顏色同樣如此。
批量生成圖片
上面生成了一張圖片,那要生成十張圖片呢,這種步驟一樣,只是顏色改變的,利用循環(huán)就可以解決。首先創(chuàng)建一個(gè)顏色列表,把要生成的圖片顏色放進(jìn)去。接著循環(huán)獲取不同的顏色,保存的時(shí)候利用字符串拼接的方法改變圖片的名字。
本地生成的圖片
封裝成函數(shù)
前面的方法已經(jīng)可以批量生成圖片了,為了通用性強(qiáng)一點(diǎn),我們可以封裝成函數(shù),把哪些可以改變的參數(shù)單獨(dú)抽離出來。尺寸也同樣,使用的時(shí)候,可以根據(jù)自己的需要定義顏色列表和尺寸。當(dāng)然還有加一些提示用語和報(bào)錯(cuò)兼容性,這里就不講了。
本地生成的圖片
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è)椒鹽噪聲的名字是誰起的感覺隔壁小孩都饞哭了
用到了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)
為避免中文顯示出錯(cuò),需導(dǎo)入matplotlib.pylab庫
1.2.1 確定數(shù)據(jù)
1.2.2 創(chuàng)建畫布
1.2.3 添加標(biāo)題
1.2.4 添加x,y軸名稱
1.2.5 添加x,y軸范圍
1.2.6 添加x,y軸刻度
1.2.7 繪制曲線、圖例, 并保存圖片
保存圖片時(shí),dpi為清晰度,數(shù)值越高越清晰。請(qǐng)注意,函數(shù)結(jié)尾處,必須加plt.show(),不然圖像不顯示。
繪制流程與繪制不含子圖的圖像一致,只需注意一點(diǎn):創(chuàng)建畫布。
合理調(diào)整figsize、dpi,可避免出現(xiàn)第一幅圖橫軸名稱與第二幅圖標(biāo)題相互遮蓋的現(xiàn)象.
2.2.1 rc參數(shù)類型
2.2.2 方法1:使用rcParams設(shè)置
2.2.3 方法2:plot內(nèi)設(shè)置
2.2.4 方法3:plot內(nèi)簡化設(shè)置
方法2中,線條形狀,linestyle可簡寫為ls;線條寬度,linewidth可簡寫為lw;線條顏色,color可簡寫為c,等等。
1. 簡介。
圖像處理是一門應(yīng)用非常廣的技術(shù),而擁有非常豐富第三方擴(kuò)展庫的 Python 當(dāng)然不會(huì)錯(cuò)過這一門盛宴。PIL (Python Imaging Library)是 Python 中最常用的圖像處理庫,目前版本為 1.1.7,我們可以?在這里?下載學(xué)習(xí)和查找資料。
Image 類是 PIL 庫中一個(gè)非常重要的類,通過這個(gè)類來創(chuàng)建實(shí)例可以有直接載入圖像文件,讀取處理過的圖像和通過抓取的方法得到的圖像這三種方法。
2. 使用。
導(dǎo)入 Image 模塊。然后通過 Image 類中的 open 方法即可載入一個(gè)圖像文件。如果載入文件失敗,則會(huì)引起一個(gè) IOError ;若無返回錯(cuò)誤,則 open 函數(shù)返回一個(gè) Image 對(duì)象。現(xiàn)在,我們可以通過一些對(duì)象屬性來檢查文件內(nèi)容,即:
1 import Image
2 ? im = Image.open("j.jpg")
3 ? print im.format, im.size, im.mode
4 JPEG (440, 330) RGB
這里有三個(gè)屬性,我們逐一了解。
format : 識(shí)別圖像的源格式,如果該文件不是從文件中讀取的,則被置為 None 值。
size : 返回的一個(gè)元組,有兩個(gè)元素,其值為象素意義上的寬和高。
mode : RGB(true color image),此外還有,L(luminance),CMTK(pre-press image)。
現(xiàn)在,我們可以使用一些在 Image 類中定義的方法來操作已讀取的圖像實(shí)例。比如,顯示最新載入的圖像:
1 im.show()
2 ?
輸出原圖:
3. 函數(shù)概貌。
3.1 ? ?Reading and Writing Images : open( infilename ) , save( outfilename )
3.2 ? ?Cutting and Pasting and Merging Images :
crop() : 從圖像中提取出某個(gè)矩形大小的圖像。它接收一個(gè)四元素的元組作為參數(shù),各元素為(left, upper, right, lower),坐標(biāo)系統(tǒng)的原點(diǎn)(0, 0)是左上角。
paste() :
merge() :
1 box = (100, 100, 200, 200)
2 ? region = im.crop(box)
3 ? region.show()
4 ? region = region.transpose(Image.ROTATE_180)
5 ? region.show()
6 ? im.paste(region, box)
7 ? im.show()
其效果圖為:
旋轉(zhuǎn)一幅圖片:
1 def roll(image, delta):
2 ?? ?"Roll an image sideways"
3
4 ?? ?xsize, ysize = image.size
5
6 ?? ?delta = delta % xsize
7 ?? ?if delta == 0: return image
8
9 ?? ?part1 = image.crop((0, 0, delta, ysize))
10 ?? ?part2 = image.crop((delta, 0, xsize, ysize))
11 ?? ?image.paste(part2, (0, 0, xsize-delta, ysize))
12 ?? ?image.paste(part1, (xsize-delta, 0, xsize, ysize))
13
14 ?? ?return image
3.3 ? ?幾何變換。
3.3.1 ? ?簡單的幾何變換。
1 out = im.resize((128, 128)) ? ? ? ? ? ? ? ? ? ? #
2 ?out = im.rotate(45) ? ? ? ? ? ? ? ? ? ? ? ? ? ??#逆時(shí)針旋轉(zhuǎn) 45 度角。
3 ?out = im.transpose(Image.FLIP_LEFT_RIGHT) ? ? ? #左右對(duì)換。
4 ?out = im.transpose(Image.FLIP_TOP_BOTTOM) ? ? ? #上下對(duì)換。
5 ?out = im.transpose(Image.ROTATE_90) ? ? ? ? ? ? #旋轉(zhuǎn) 90 度角。
6 ?out = im.transpose(Image.ROTATE_180) ? ? ? ? ? ?#旋轉(zhuǎn) 180 度角。
7 out = im.transpose(Image.ROTATE_270) ? ? ? ? ? ?#旋轉(zhuǎn) 270 度角。
各個(gè)調(diào)整之后的圖像為:
圖片1:
圖片2:
圖片3:
圖片4:
3.3.2 ? ?色彩空間變換。
convert() : 該函數(shù)可以用來將圖像轉(zhuǎn)換為不同色彩模式。
3.3.3 ? ?圖像增強(qiáng)。
Filters : 在 ImageFilter 模塊中可以使用 filter 函數(shù)來使用模塊中一系列預(yù)定義的增強(qiáng)濾鏡。
1 import ImageFilter
2 imfilter = im.filter(ImageFilter.DETAIL)
3 imfilter.show()
3.4 ? ?序列圖像。
即我們常見到的動(dòng)態(tài)圖,最常見的后綴為 .gif ,另外還有 FLI / FLC 。PIL 庫對(duì)這種動(dòng)畫格式圖也提供了一些基本的支持。當(dāng)我們打開這類圖像文件時(shí),PIL 自動(dòng)載入圖像的第一幀。我們可以使用 seek 和 tell 方法在各幀之間移動(dòng)。
1 import Image
2 im.seek(1) ? ? ? ?# skip to the second frame
3
4 try:
5 ?? ?while 1:
6 ?? ? ? ?im.seek( im.tell() + 1)
7 ?? ? ? ?# do something to im
8 except EOFError:
9 ?? ?pass
3.5 ? ?更多關(guān)于圖像文件的讀取。
最基本的方式:im = Image.open("filename")
類文件讀取:fp = open("filename", "rb"); im = Image.open(fp)
字符串?dāng)?shù)據(jù)讀取:import StringIO; im = Image.open(StringIO.StringIO(buffer))
從歸檔文件讀取:import TarIO; fp = TarIo.TarIO("Image.tar", "Image/test/lena.ppm"); im = Image.open(fp)
基本的 PIL 目前就練習(xí)到這里。其他函數(shù)的功能可點(diǎn)擊?這里?進(jìn)一步閱讀。
Python內(nèi)置函數(shù)有很多,為大家推薦5個(gè)神仙級(jí)的內(nèi)置函數(shù):
(1)Lambda函數(shù)
用于創(chuàng)建匿名函數(shù),即沒有名稱的函數(shù)。它只是一個(gè)表達(dá)式,函數(shù)體比def簡單很多。當(dāng)我們需要?jiǎng)?chuàng)建一個(gè)函數(shù)來執(zhí)行單個(gè)操作并且可以在一行中編寫時(shí),就可以用到匿名函數(shù)了。
Lamdba的主體是一個(gè)表達(dá)式,而不是一個(gè)代碼塊。僅僅能在lambda表達(dá)式中封裝有限的邏輯進(jìn)去。
利用Lamdba函數(shù),往往可以將代碼簡化許多。
(2)Map函數(shù)
會(huì)將一個(gè)函數(shù)映射到一個(gè)輸入列表的所有元素上,比如我們先創(chuàng)建了一個(gè)函數(shù)來返回一個(gè)大寫的輸入單詞,然后將此函數(shù)應(yīng)有到列表colors中的所有元素。
我們還可以使用匿名函數(shù)lamdba來配合map函數(shù),這樣可以更加精簡。
(3)Reduce函數(shù)
當(dāng)需要對(duì)一個(gè)列表進(jìn)行一些計(jì)算并返回結(jié)果時(shí),reduce()是個(gè)非常有用的函數(shù)。舉個(gè)例子,當(dāng)需要計(jì)算一個(gè)整數(shù)列表所有元素的乘積時(shí),即可使用reduce函數(shù)實(shí)現(xiàn)。
它與函數(shù)的最大的區(qū)別就是,reduce()里的映射函數(shù)(function)接收兩個(gè)參數(shù),而map接收一個(gè)參數(shù)。
(4)enumerate函數(shù)
用于將一個(gè)可遍歷的數(shù)據(jù)對(duì)象(如列表、元組或字符串)組合為一個(gè)索引序列,同時(shí)列出數(shù)據(jù)和數(shù)據(jù)下標(biāo),一般用在for循環(huán)當(dāng)中。
它的兩個(gè)參數(shù),一個(gè)是序列、迭代器或其他支持迭代對(duì)象;另一個(gè)是下標(biāo)起始位置,默認(rèn)情況從0開始,也可以自定義計(jì)數(shù)器的起始編號(hào)。
(5)Zip函數(shù)
用于將可迭代的對(duì)象作為參數(shù),將對(duì)象中對(duì)應(yīng)的元素打包成一個(gè)個(gè)元組,然后返回由這些元組組成的列表
當(dāng)我們使用zip()函數(shù)時(shí),如果各個(gè)迭代器的元素個(gè)數(shù)不一致,則返回列表長度與最短的對(duì)象相同。
1、map
map()函數(shù)接受兩個(gè)參數(shù),一個(gè)是函數(shù),一個(gè)是Iterable,map將傳入的函數(shù)依次作用到序列的每一個(gè)元素上,并把結(jié)果作為新的Iterator返回。
舉例,比如我們有一個(gè)函數(shù)f(x)=x*2,要把這個(gè)函數(shù)作用在一個(gè)list[1, 2, 3, 4, 5, 6, 7, 8,
9]上,就可以用map()實(shí)現(xiàn)。
def f(x):
... return x*2
...
r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
list(r)
[2, 4, 6, 8, 10, 12, 14, 16, 18]
所以,map()作為高階函數(shù),事實(shí)上它把運(yùn)算規(guī)則抽象了,因此,我們不但可以計(jì)算簡單的f(x)=x*2,還可以計(jì)算任意復(fù)雜的函數(shù),比如把這個(gè)list所有的數(shù)字轉(zhuǎn)為字符串:
list(map(str,[1, 2, 3, 4, 5, 6, 7, 8, 9]))
["1", "2", "3", "4", "5", "6", "7", "8", "9"]
2、reduce
reduce是把一個(gè)函數(shù)作用在一個(gè)序列[x1, x2,
x3……]上,這個(gè)函數(shù)必須接收兩個(gè)參數(shù),reduce把結(jié)果繼續(xù)和序列的下一個(gè)元素做累計(jì)計(jì)算。簡單來說,就是先計(jì)算x1和x2的結(jié)果,再拿結(jié)果與x3計(jì)算,依次類推。比如說一個(gè)序列求和,就可以用reduce實(shí)現(xiàn)。
from functools import reduce
def add(x, y):
... return x + y
...
reduce(add, [1, 3, 5, 7, 9])
25
也就是說,假設(shè)python沒有提供int()函數(shù),你完全可以自己寫一個(gè)把字符串轉(zhuǎn)化為整數(shù)的函數(shù),而且只需要幾行代碼。
3、filter
用于過濾序列,和map函數(shù)類似,filter也接收一個(gè)函數(shù)和一個(gè)序列,不同于map的是,filter把傳入的函數(shù)依次作用于每一個(gè)元素,然后根據(jù)返回值是True還是False決定保留還是丟棄該元素,例如,在一個(gè)list中,刪掉偶數(shù),只保留奇數(shù),可以這么寫:
def is_odd(n):
return n % 2 == 1
list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))
# 結(jié)果: [1, 5, 9, 15]
把一個(gè)序列中的空字符串刪掉,可以這么寫:
def not_empty(s):
return s and s.strip()
list(filter(not_empty, ["A", "", "B", None, "C", " "]))
# 結(jié)果: ["A", "B", "C"]
可見用filter()這個(gè)高階函數(shù),關(guān)鍵在于正確實(shí)現(xiàn)一個(gè)篩選函數(shù)。
4、sorted
無論冒泡排序還是快速排序,排序的核心是比較兩個(gè)元素的大小。如果是數(shù)字,我們可以直接比較,但如果是字符串或者兩個(gè)dict呢?直接比較數(shù)學(xué)上的大小是沒有意義的,因此,比較的過程必須通過函數(shù)抽象出來,Python內(nèi)置的sorted()函數(shù)就可以對(duì)list進(jìn)行排序:
sorted([36, 5, -12, 9, -21])
[-21, -12, 5, 9, 36]
此外,sorted()函數(shù)也是一個(gè)高階函數(shù),它還可以接收一個(gè)key函數(shù)來實(shí)現(xiàn)自定義的排序,例如按絕對(duì)值大小排序:
sorted([36, 5, -12, 9, -21], key=abs)
[5, 9, -12, -21, 36]
本文名稱:Python圖像映射函數(shù) python中的映射
網(wǎng)站鏈接:http://vcdvsql.cn/article34/dooogpe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號(hào)、網(wǎng)站導(dǎo)航、自適應(yīng)網(wǎng)站、移動(dòng)網(wǎng)站建設(shè)、企業(yè)建站、Google
聲明:本網(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)