Python圖像映射函數(shù) python中的映射

python處理圖片數(shù)據(jù)?

生成一張純色的圖片

在昌邑等地區(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)整合營(yí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ú)抽離出來(lái)。尺寸也同樣,使用的時(shí)候,可以根據(jù)自己的需要定義顏色列表和尺寸。當(dāng)然還有加一些提示用語(yǔ)和報(bào)錯(cuò)兼容性,這里就不講了。

本地生成的圖片

數(shù)字圖像處理Python實(shí)現(xià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ì)比,我自己隨便寫(xiě)了個(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)濾波之前先添加高斯噪聲和椒鹽噪聲(代碼來(lái)源于網(wǎng)絡(luò))

不知道這個(gè)椒鹽噪聲的名字是誰(shuí)起的感覺(jué)隔壁小孩都饞哭了

用到了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)

下面開(kāi)始均值濾波和中值濾波了

就以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)

Python matplotlib之函數(shù)圖像繪制、線條rc參數(shù)設(shè)置

為避免中文顯示出錯(cuò),需導(dǎo)入matplotlib.pylab庫(kù)

1.2.1 確定數(shù)據(jù)

1.2.2 創(chuàng)建畫(huà)布

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)建畫(huà)布。

合理調(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)簡(jiǎn)化設(shè)置

方法2中,線條形狀,linestyle可簡(jiǎn)寫(xiě)為ls;線條寬度,linewidth可簡(jiǎn)寫(xiě)為lw;線條顏色,color可簡(jiǎn)寫(xiě)為c,等等。

Python如何圖像識(shí)別?

1. 簡(jiǎn)介。

圖像處理是一門應(yīng)用非常廣的技術(shù),而擁有非常豐富第三方擴(kuò)展庫(kù)的 Python 當(dāng)然不會(huì)錯(cuò)過(guò)這一門盛宴。PIL (Python Imaging Library)是 Python 中最常用的圖像處理庫(kù),目前版本為 1.1.7,我們可以?在這里?下載學(xué)習(xí)和查找資料。

Image 類是 PIL 庫(kù)中一個(gè)非常重要的類,通過(guò)這個(gè)類來(lái)創(chuàng)建實(shí)例可以有直接載入圖像文件,讀取處理過(guò)的圖像和通過(guò)抓取的方法得到的圖像這三種方法。

2. 使用。

導(dǎo)入 Image 模塊。然后通過(guò) Image 類中的 open 方法即可載入一個(gè)圖像文件。如果載入文件失敗,則會(huì)引起一個(gè) IOError ;若無(wú)返回錯(cuò)誤,則 open 函數(shù)返回一個(gè) Image 對(duì)象?,F(xiàn)在,我們可以通過(guò)一些對(duì)象屬性來(lái)檢查文件內(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 類中定義的方法來(lái)操作已讀取的圖像實(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 ? ?簡(jiǎn)單的幾何變換。

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ù)可以用來(lái)將圖像轉(zhuǎn)換為不同色彩模式。

3.3.3 ? ?圖像增強(qiáng)。

Filters : 在 ImageFilter 模塊中可以使用 filter 函數(shù)來(lái)使用模塊中一系列預(yù)定義的增強(qiáng)濾鏡。

1 import ImageFilter

2 imfilter = im.filter(ImageFilter.DETAIL)

3 imfilter.show()

3.4 ? ?序列圖像。

即我們常見(jiàn)到的動(dòng)態(tài)圖,最常見(jiàn)的后綴為 .gif ,另外還有 FLI / FLC 。PIL 庫(kù)對(duì)這種動(dòng)畫(huà)格式圖也提供了一些基本的支持。當(dāng)我們打開(kāi)這類圖像文件時(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")

類文件讀?。篺p = open("filename", "rb"); im = Image.open(fp)

字符串?dāng)?shù)據(jù)讀?。篿mport StringIO; im = Image.open(StringIO.StringIO(buffer))

從歸檔文件讀?。篿mport 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ù)

Python內(nèi)置函數(shù)有很多,為大家推薦5個(gè)神仙級(jí)的內(nèi)置函數(shù):

(1)Lambda函數(shù)

用于創(chuàng)建匿名函數(shù),即沒(méi)有名稱的函數(shù)。它只是一個(gè)表達(dá)式,函數(shù)體比def簡(jiǎn)單很多。當(dāng)我們需要?jiǎng)?chuàng)建一個(gè)函數(shù)來(lái)執(zhí)行單個(gè)操作并且可以在一行中編寫(xiě)時(shí),就可以用到匿名函數(shù)了。

Lamdba的主體是一個(gè)表達(dá)式,而不是一個(gè)代碼塊。僅僅能在lambda表達(dá)式中封裝有限的邏輯進(jìn)去。

利用Lamdba函數(shù),往往可以將代碼簡(jiǎn)化許多。

(2)Map函數(shù)

會(huì)將一個(gè)函數(shù)映射到一個(gè)輸入列表的所有元素上,比如我們先創(chuàng)建了一個(gè)函數(shù)來(lái)返回一個(gè)大寫(xiě)的輸入單詞,然后將此函數(shù)應(yīng)有到列表colors中的所有元素。

我們還可以使用匿名函數(shù)lamdba來(lái)配合map函數(shù),這樣可以更加精簡(jiǎn)。

(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開(kāi)始,也可以自定義計(jì)數(shù)器的起始編號(hào)。

(5)Zip函數(shù)

用于將可迭代的對(duì)象作為參數(shù),將對(duì)象中對(duì)應(yīng)的元素打包成一個(gè)個(gè)元組,然后返回由這些元組組成的列表

當(dāng)我們使用zip()函數(shù)時(shí),如果各個(gè)迭代器的元素個(gè)數(shù)不一致,則返回列表長(zhǎng)度與最短的對(duì)象相同。

python高階函數(shù)有哪些

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ì)算簡(jiǎn)單的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ì)算。簡(jiǎn)單來(lái)說(shuō),就是先計(jì)算x1和x2的結(jié)果,再拿結(jié)果與x3計(jì)算,依次類推。比如說(shuō)一個(gè)序列求和,就可以用reduce實(shí)現(xiàn)。

from functools import reduce

def add(x, y):

... return x + y

...

reduce(add, [1, 3, 5, 7, 9])

25

也就是說(shuō),假設(shè)python沒(méi)有提供int()函數(shù),你完全可以自己寫(xiě)一個(gè)把字符串轉(zhuǎn)化為整數(shù)的函數(shù),而且只需要幾行代碼。

3、filter

用于過(guò)濾序列,和map函數(shù)類似,filter也接收一個(gè)函數(shù)和一個(gè)序列,不同于map的是,filter把傳入的函數(shù)依次作用于每一個(gè)元素,然后根據(jù)返回值是True還是False決定保留還是丟棄該元素,例如,在一個(gè)list中,刪掉偶數(shù),只保留奇數(shù),可以這么寫(xiě):

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è)序列中的空字符串刪掉,可以這么寫(xiě):

def not_empty(s):

return s and s.strip()

list(filter(not_empty, ["A", "", "B", None, "C", " "]))

# 結(jié)果: ["A", "B", "C"]

可見(jiàn)用filter()這個(gè)高階函數(shù),關(guān)鍵在于正確實(shí)現(xiàn)一個(gè)篩選函數(shù)。

4、sorted

無(wú)論冒泡排序還是快速排序,排序的核心是比較兩個(gè)元素的大小。如果是數(shù)字,我們可以直接比較,但如果是字符串或者兩個(gè)dict呢?直接比較數(shù)學(xué)上的大小是沒(méi)有意義的,因此,比較的過(guò)程必須通過(guò)函數(shù)抽象出來(lái),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ù)來(lái)實(shí)現(xiàn)自定義的排序,例如按絕對(duì)值大小排序:

sorted([36, 5, -12, 9, -21], key=abs)

[5, 9, -12, -21, 36]

本文名稱:Python圖像映射函數(shù) python中的映射
網(wǎng)站鏈接:http://muchs.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í)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名