python圖片灰度值-九游会j9娱乐平台
❶ '求助'python怎麼判斷圖片是否為灰度圖
這里判斷是否為灰度圖的標準是:每一個像素所對應的r、g、b的值是否相等。
def is_color_image(url):
im=image.open(url)
pix=im.convert('rgb')
width=im.size[0]
height=im.size[1]
oimage_color_type="grey image"
is_color=[]
for x in range(width):
for y in range(height):
r,g,b=pix.getpixel((x,y))
r=int(r)
g=int(g)
b=int(b)
if (r==g) and (g==b):
pass
else:
oimage_color_type='color image'
return oimage_color_type
❷ 如何使用python來判斷圖片相似度
from pil import imageimport os#import hashlib def getgray(image_file): tmpls=[] for h in range(0, image_file.size[1]):#h for w in range(0, image_file.size[0]):#w tmpls.append( image_file.getpixel((w,h)) ) return tmpls def getavg(ls):#獲取平均灰度值 return sum(ls)/len(ls) def getmh(a,b):#比較100個字元有幾個字元相同 dist = 0; for i in range(0,len(a)): if a[i]==b[i]: dist=dist 1 return dist def getimghash(fne): image_file = image.open(fne) # 打開 image_file=image_file.resize((12, 12))#重置圖片大小我12px x 12px image_file=image_file.convert("l")#轉256灰度圖 grayls=getgray(image_file)#灰度集合 avg=getavg(grayls)#灰度平均值 bitls=''#接收獲取0或1 #除去變寬1px遍歷像素 for h in range(1, image_file.size[1]-1):#h for w in range(1, image_file.size[0]-1):#w if image_file.getpixel((w,h))>=avg:#像素的值比較平均值 大於記為1 小於記為0 bitls=bitls '1' else: bitls=bitls '0' return bitls''' m2 = hashlib.md5() m2.update(bitls) print m2.hexdigest(),bitls return m2.hexdigest()''' a=getimghash("./test/測試圖片.jpg")#圖片地址自行替換files = os.listdir("./test")#圖片文件夾地址自行替換for file in files: b=getimghash("./test/" str(file)) compare=getmh(a,b) print file,u'相似度',str(compare) '%'
❸ 怎樣使用python圖像處理
python圖像處理是一種簡單易學,功能強大的解釋型編程語言,它有簡潔明了的語法,高效率的高層數據結構,能夠簡單而有效地實現面向對象編程,下文進行對python圖像處理進行說明。
當然,首先要感謝「戀花蝶」,是他的文章「用python圖像處理 」 幫我堅定了用python和pil解決問題的想法,對於pil的一些介紹和基本操作,可以看看這篇文章。我這里主要是介紹點我在使用過程中的經驗。
pil可以對圖像的顏色進行轉換,並支持諸如24位彩色、8位灰度圖和二值圖等模式,簡單的轉換可以通過image.convert(mode)函數完 成,其中mode表示輸出的顏色模式。例如''l''表示灰度,''1''表示二值圖模式等。
但是利用convert函數將灰度圖轉換為二值圖時,是採用固定的閾 值127來實現的,即灰度高於127的像素值為1,而灰度低於127的像素值為0。為了能夠通過自定義的閾值實現灰度圖到二值圖的轉換,就要用到 image.point函數。
深度剖析python語法功能
深度說明python應用程序特點
對python資料庫進行學習研究
python開發人員對python經驗之談
對python動態類型語言解析
image.point函數有多種形式,這里只討論image.point(table, mode),利用該函數可以通過查表的方式實現像素顏色的模式轉換。其中table為顏色轉換過程中的映射表,每個顏色通道應當有256個元素,而 mode表示所輸出的顏色模式,同樣的,''l''表示灰度,''1''表示二值圖模式。
可見,轉換過程的關鍵在於設計映射表,如果只是需要一個簡單的箝位值,可以將table中高於或低於箝位值的元素分別設為1與0。當然,由於這里的table並沒有什麼特殊要求,所以可以通過對元素的特殊設定實現(0, 255)范圍內,任意需要的一對一映射關系。
示例代碼如下:
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部分通常要完成的任務相當繁重但支撐這些工作的資源卻很少,這已經成為公開的秘密。任何承諾提高編碼效率、降低軟體總成本的it解決方案都應該進行 周到的考慮。python圖像處理所具有的一個顯著優勢就是可以在企業的軟體創建和維護階段節約大量資金,而這兩個階段的軟體成本佔到了軟體整個生命周期中總成本 的50%到95%。
python清晰可讀的語法使得軟體代碼具有異乎尋常的易讀性,甚至對那些不是最初接觸和開發原始項目的程序員都 能具有這樣的強烈感覺。雖然某些程序員反對在python代碼中大量使用空格。
不過,幾乎人人都承認python圖像處理的可讀性遠勝於c或者java,後兩 者都採用了專門的字元標記代碼塊結構、循環、函數以及其他編程結構的開始和結束。提倡python的人還宣稱,採用這些字元可能會產生顯著的編程風格差 異,使得那些負責維護代碼的人遭遇代碼可讀性方面的困難。轉載
❹ python下使用opencv3,如何在一幅灰度圖中,為所有灰度為某特定值的點賦另一灰度值
你好,我覺得用np.where是可以實現的,下面是相關的實現代碼:
importcv2
importnumpyasnp
image=np.zeros((400,400,3),dtype="uint8")
raw=image.()
image[np.where((image==[0,0,0]).all(axis=2))]=[255,255,255]
cv2.imshow('test0',image)
lower_black=np.array([0,0,0],dtype="uint16")
upper_black=np.array([70,70,70],dtype="uint16")
black_mask=cv2.inrange(image,lower_black,upper_black)
image[np.where((image==[0,0,0]).all(axis=2))]=[155,255,155]
black_mask[np.where(black_mask==[0])]=[155]
cv2.imshow('test',image)
cv2.imshow('test2',raw)
cv2.imshow('test3',black_mask)
❺ python處理圖片數據
目錄
1.機器是如何存儲圖像的?
2.在python中讀取圖像數據
3.從圖像數據中提取特徵的方法#1:灰度像素值特徵
4.從圖像數據中提取特徵的方法#2:通道的平均像素值
5.從圖像數據中提取特徵的方法#3:提取邊緣
是一張數字8的圖像,仔細觀察就會發現,圖像是由小方格組成的。這些小方格被稱為像素。
但是要注意,人們是以視覺的形式觀察圖像的,可以輕松區分邊緣和顏色,從而識別圖片中的內容。然而機器很難做到這一點,它們以數字的形式存儲圖像。請看下圖:
機器以數字矩陣的形式儲存圖像,矩陣大小取決於任意給定圖像的像素數。
假設圖像的尺寸為180 x 200或n x m,這些尺寸基本上是圖像中的像素數(高x寬)。
這些數字或像素值表示像素的強度或亮度,較小的數字(接近0)表示黑色,較大的數字(接近255)表示白色。通過分析下面的圖像,讀者就會弄懂到目前為止所學到的知識。
下圖的尺寸為22 x 16,讀者可以通過計算像素數來驗證:
圖片源於機器學習應用課程
剛才討論的例子是黑白圖像,如果是生活中更為普遍的彩色呢?你是否認為彩色圖像也以2d矩陣的形式存儲?
彩色圖像通常由多種顏色組成,幾乎所有顏色都可以從三原色(紅色,綠色和藍色)生成。
因此,如果是彩色圖像,則要用到三個矩陣(或通道)——紅、綠、藍。每個矩陣值介於0到255之間,表示該像素的顏色強度。觀察下圖來理解這個概念:
圖片源於機器學習應用課程
左邊有一幅彩色圖像(人類可以看到),而在右邊,紅綠藍三個顏色通道對應三個矩陣,疊加三個通道以形成彩色圖像。
請注意,由於原始矩陣非常大且可視化難度較高,因此這些不是給定圖像的原始像素值。此外,還可以用各種其他的格式來存儲圖像,rgb是最受歡迎的,所以筆者放到這里。讀者可以在此處閱讀更多關於其他流行格式的信息。
用python讀取圖像數據
下面開始將理論知識付諸實踐。啟動python並載入圖像以觀察矩陣:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
from skimage.io import imread, imshow
image = imread('image_8_original.png', as_gray=true)
imshow(image)
#checking image shape
image.shape, image
(28,28)
矩陣有784個值,而且這只是整個矩陣的一小部分。用一個live編碼窗口,不用離開本文就可以運行上述所有代碼並查看結果。
下面來深入探討本文背後的核心思想,並探索使用像素值作為特徵的各種方法。
方法#1:灰度像素值特徵
從圖像創建特徵最簡單的方法就是將原始的像素用作單獨的特徵。
考慮相同的示例,就是上面那張圖(數字『8』),圖像尺寸為28×28。
能猜出這張圖片的特徵數量嗎?答案是與像素數相同!也就是有784個。
那麼問題來了,如何安排這784個像素作為特徵呢?這樣,可以簡單地依次追加每個像素值從而生成特徵向量。如下圖所示:
下面來用python繪制圖像,並為該圖像創建這些特徵:
image = imread('puppy.jpeg', as_gray=true)
image.shape, imshow(image)
(650,450)
該圖像尺寸為650×450,因此特徵數量應為297,000。可以使用numpy中的reshape函數生成,在其中指定圖像尺寸:
#pixel features
features = np.reshape(image, (660*450))
features.shape, features
(297000,)
array([0.96470588, 0.96470588, 0.96470588, ..., 0.96862745, 0.96470588,
0.96470588])
這里就得到了特徵——長度為297,000的一維數組。很簡單吧?在實時編碼窗口中嘗試使用此方法提取特徵。
但結果只有一個通道或灰度圖像,對於彩色圖像是否也可以這樣呢?來看看吧!
方法#2:通道的平均像素值
在讀取上一節中的圖像時,設置了參數『as_gray = true』,因此在圖像中只有一個通道,可以輕松附加像素值。下面刪除參數並再次載入圖像:
image = imread('puppy.jpeg')
image.shape
(660, 450, 3)
這次,圖像尺寸為(660,450,3),其中3為通道數量。可以像之前一樣繼續創建特徵,此時特徵數量將是660*450*3 = 891,000。
或者,可以使用另一種方法:
生成一個新矩陣,這個矩陣具有來自三個通道的像素平均值,而不是分別使用三個通道中的像素值。
下圖可以讓讀者更清楚地了解這一思路:
這樣一來,特徵數量保持不變,並且還能考慮來自圖像全部三個通道的像素值。
image = imread('puppy.jpeg')
feature_matrix = np.zeros((660,450))
feature_matrix.shape
(660, 450)
現有一個尺寸為(660×450×3)的三維矩陣,其中660為高度,450為寬度,3是通道數。為獲取平均像素值,要使用for循環:
for i in range(0,iimage.shape[0]):
for j in range(0,image.shape[1]):
feature_matrix[i][j] = ((int(image[i,j,0]) int(image[i,j,1]) int(image[i,j,2]))/3)
新矩陣具有相同的高度和寬度,但只有一個通道。現在,可以按照與上一節相同的步驟進行操作。依次附加像素值以獲得一維數組:
features = np.reshape(feature_matrix, (660*450))
features.shape
(297000,)
方法#3:提取邊緣特徵
請思考,在下圖中,如何識別其中存在的對象:
識別出圖中的對象很容易——狗、汽車、還有貓,那麼在區分的時候要考慮哪些特徵呢?形狀是一個重要因素,其次是顏色,或者大小。如果機器也能像這樣識別形狀會怎麼樣?
類似的想法是提取邊緣作為特徵並將其作為模型的輸入。稍微考慮一下,要如何識別圖像中的邊緣呢?邊緣一般都是顏色急劇變化的地方,請看下圖:
筆者在這里突出了兩個邊緣。這兩處邊緣之所以可以被識別是因為在圖中,可以分別看到顏色從白色變為棕色,或者由棕色變為黑色。如你所知,圖像以數字的形式表示,因此就要尋找哪些像素值發生了劇烈變化。
假設圖像矩陣如下:
圖片源於機器學習應用課程
該像素兩側的像素值差異很大,於是可以得出結論,該像素處存在顯著的轉變,因此其為邊緣。現在問題又來了,是否一定要手動執行此步驟?
當然不!有各種可用於突出顯示圖像邊緣的內核,剛才討論的方法也可以使用prewitt內核(在x方向上)來實現。以下是prewitt內核:
獲取所選像素周圍的值,並將其與所選內核(prewitt內核)相乘,然後可以添加結果值以獲得最終值。由於±1已經分別存在於兩列之中,因此添加這些值就相當於獲取差異。
還有其他各種內核,下面是四種最常用的內核:
圖片源於機器學習應用課程
現在回到筆記本,為同一圖像生成邊緣特徵:
#importing the required libraries
import numpy as np
from skimage.io import imread, imshow
from skimage.filters import prewitt_h,prewitt_v
import matplotlib.pyplot as plt
%matplotlib inline
#reading the image
image = imread('puppy.jpeg',as_gray=true)
#calculating horizontal edges using prewitt kernel
edges_prewitt_horizontal = prewitt_h(image)
#calculating vertical edges using prewitt kernel
edges_prewitt_vertical = prewitt_v(image)
imshow(edges_prewitt_vertical, cmap='gray')
❻ python的pillow庫怎麼處理灰度圖像
pillow是python里的圖像處理庫(pil:python image library),提供了了廣泛的文件格式支持,強大的圖像處理能力,主要包括圖像儲存、圖像顯示、格式轉換以及基本的圖像處理操作等。
1)使用 image 類
pil最重要的類是 image class, 你可以通過多種方法創建這個類的實例;你可以從文件載入圖像,或者處理其他圖像, 或者從 scratch 創建。
要從文件載入圖像,可以使用open( )函數,在image模塊中:
>>> from pil import image
>>> im = image.open("e:/photoshop/1.jpg")
載入成功後,將返回一個image對象,可以通過使用示例屬性查看文件內容:
>>> print(im.format, im.size, im.mode)
('jpeg', (600, 351), 'rgb')
>>>
format 這個屬性標識了圖像來源。如果圖像不是從文件讀取它的值就是none。size屬性是一個二元tuple,包含width和height(寬度和高度,單位都是px)。 mode 屬性定義了圖像bands的數量和名稱,以及像素類型和深度。常見的modes 有 「l」 (luminance) 表示灰度圖像, 「rgb」 表示真彩色圖像, and 「cmyk」 表示出版圖像。
如果文件打開錯誤,返回 ioerror 錯誤。
只要你有了 image 類的實例,你就可以通過類的方法處理圖像。比如,下列方法可以顯示圖像:
im.show()
2)讀寫圖像
pil 模塊支持大量圖片格式。使用在 image 模塊的 open() 函數從磁碟讀取文件。你不需要知道文件格式就能打開它,這個庫能夠根據文件內容自動確定文件格式。要保存文件,使用 image 類的 save() 方法。保存文件的時候文件名變得重要了。除非你指定格式,否則這個庫將會以文件名的擴展名作為格式保存。
載入文件,並轉化為png格式:
"python image library test"
from pil import image
import os
import sys
for infile in sys.argv[1:]:
f,e = os.path.splitext(infile)
outfile = f ".png"
if infile != outfile:
try:
image.open(infile).save(outfile)
except ioerror:
print("cannot convert", infile)
save() 方法的第二個參數可以指定文件格式。
3)創建縮略圖
縮略圖是網路開發或圖像軟體預覽常用的一種基本技術,使用python的pillow圖像庫可以很方便的建立縮略圖,如下:
# create thumbnail
size = (128,128)
for infile in glob.glob("e:/photoshop/*.jpg"):
f, ext = os.path.splitext(infile)
img = image.open(infile)
img.thumbnail(size,image.antialias)
img.save(f ".thumbnail","jpeg")
上段代碼對photoshop下的jpg圖像文件全部創建縮略圖,並保存,glob模塊是一種智能化的文件名匹配技術,在批圖像處理中經常會用到。
注意:pillow庫不會直接解碼或者載入圖像柵格數據。當你打開一個文件,只會讀取文件頭信息用來確定格式,顏色模式,大小等等,文件的剩餘部分不會主動處理。這意味著打開一個圖像文件的操作十分快速,跟圖片大小和壓縮方式無關。
4)圖像的剪切、粘貼與合並操作
image 類包含的方法允許你操作圖像部分選區,pil.image.image.crop 方法獲取圖像的一個子矩形選區,如:
# crop, paste and merge
im = image.open("e:/photoshop/lena.jpg")
box = (100,100,300,300)
region = im.crop(box)
矩形選區有一個4元元組定義,分別表示左、上、右、下的坐標。這個庫以左上角為坐標原點,單位是px,所以上訴代碼復制了一個 200×200 pixels 的矩形選區。這個選區現在可以被處理並且粘貼到原圖。
region = region.transpose(image.rotate_180)
im.paste(region, box)
當你粘貼矩形選區的時候必須保證尺寸一致。此外,矩形選區不能在圖像外。然而你不必保證矩形選區和原圖的顏色模式一致,因為矩形選區會被自動轉換顏色。
5)分離和合並顏色通道
對於多通道圖像,有時候在處理時希望能夠分別對每個通道處理,處理完成後重新合成多通道,在pillow中,很簡單,如下:
r,g,b = im.split()
im = image.merge("rgb", (r,g,b))
對於split( )函數,如果是單通道的,則返回其本身,否則,返回各個通道。
6)幾何變換
對圖像進行幾何變換是一種基本處理,在pillow中包括resize( )和rotate( ),如用法如下:
out = im.resize((128,128))
out = im.rotate(45) # degree conter-clockwise
其中,resize( )函數的參數是一個新圖像大小的元祖,而rotate( )則需要輸入順時針的旋轉角度。在pillow中,對於一些常見的旋轉作了專門的定義:
out = im.transpose(image.flip_left_right)
out = im.transpose(image.flip_top_bottom)
out = im.transpose(image.rotate_90)
out = im.transpose(image.rotate_180)
out = im.transpose(image.rotate_270)
7)顏色空間變換
在處理圖像時,根據需要進行顏色空間的轉換,如將彩色轉換為灰度:
cmyk = im.convert("cmyk")
gray = im.convert("l")
8)圖像濾波
圖像濾波在imagefilter 模塊中,在該模塊中,預先定義了很多增強濾波器,可以通過filter( )函數使用,預定義濾波器包括:
blur、contour、detail、edge_enhance、edge_enhance_more、emboss、find_edges、smooth、smooth_more、sharpen。其中blur就是均值濾波,contour找輪廓,find_edges邊緣檢測,使用該模塊時,需先導入,使用方法如下:
from pil import imagefilter
imgf = image.open("e:/photoshop/lena.jpg")
outf = imgf.filter(imagefilter.detail)
conf = imgf.filter(imagefilter.contour)
edgef = imgf.filter(imagefilter.find_edges)
imgf.show()
outf.show()
conf.show()
edgef.show()
除此以外,imagefilter模塊還包括一些擴展性強的濾波器:
class pil.imagefilter.gaussianblur(radius=2)
❼ python opencv身份證灰度圖二值化應該怎麼處理
圖像的灰度處理:
cv_load_image_grayscale,這是最簡單之間的辦法,在載入圖像時直接處理
iplimage*
igray=
cvloadimage
("test.jpg",cv_load_image_grayscale);
得到的圖像就是單通道的,也能夠用這個函數:cvapi(void)
cvcvtcolor
(
const
cvarr*
src,
cvarr*
dst,
int
code
);
code=cv_bgr2gray;
opencv還提供了非常多方式,我這邊就不一一舉例了。