1. 如何用python提取出兩幅圖像中不同的部分
簡單說,兩附圖之間對應像素相減,然後求絕對值,差異大於某個特定值的就認為是不同點。(如果你的圖片是jpg壓縮,那麼由於離散餘弦變換過程去掉了高頻信息,會導致圖像顏色變化劇烈的部分出現細微鋸齒狀差異)
使用Numpy操作,np.abs(img1-img2)>thr。即可得到
2. 用matlab處理圖像,做線性分段變換,結果為什麼會出現三幅圖
你說的應該是灰度拉伸
灰度拉伸是根據灰度直方圖的分布拉伸某段灰度區間以改善輸出圖像。灰度拉伸功能用於加強選擇區域的對比度;它在0到255之間按順序取兩點x1和x2,他們將0-255之間的灰度劃分成[0,x1],[x1,x2]和[x2,255]三個灰度區間;採取一個分段式的灰度拉伸方程來強化車牌前景和背景間的灰度差異。通過調整y1和y2的大小改變灰度拉伸方程在[0,x1]和[x2,255]之間的斜率,突出[x1,x2]間的車牌區域。
這段摘自「車牌定位與字元分割的研究與實現」
按照裡面給的線性公式拉伸段內的灰度應該不難編程
3. MATLAB分段線性變換圖像處理
你說的應該是灰度拉伸
灰度拉伸是根據灰度直方圖的分布拉伸某段灰度區間以改善輸出圖像。灰度拉伸功能用於加強選擇區域的對比度;它在0到255之間按順序取兩點X1和X2,他們將0-255之間的灰度劃分成[0,x1],[x1,x2]和[x2,255]三個灰度區間;採取一個分段式的灰度拉伸方程來強化車牌前景和背景間的灰度差異。通過調整Y1和Y2的大小改變灰度拉伸方程在[0,X1]和[X2,255]之間的斜率,突出[X1,X2]間的車牌區域。
這段摘自「車牌定位與字元分割的研究與實現」
按照裡面給的線性公式拉伸段內的灰度應該不難編程
4. python圖像處理初學者求助
Pillow是Python里的圖像處理庫(PIL:Python Image Library),提供了了廣泛的文件格式支持,強大的圖像處理能力,主要包括圖像儲存、圖像顯示、格式轉換以及基本的圖像處理操作等。
1)使用 Image 類
PIL最重要的類是 Image class, 你可以通過多種方法創建這個類的實例;你可以從文件載入圖像,或者處理其他圖像, 或者從 scratch 創建。
要從文件載入圖像,可以使用open( )函數,在Image模塊中:
1
2
>>> from PIL import Image
>>> im = Image.open("E:/photoshop/1.jpg")
載入成功後,將返回一個Image對象,可以通過使用示例屬性查看文件內容:
1
2
3
>>> 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 類的實例,你就可以通過類的方法處理圖像。比如,下列方法可以顯示圖像:
1
im.show()
2)讀寫圖像
PIL 模塊支持大量圖片格式。使用在 Image 模塊的 open() 函數從磁碟讀取文件。你不需要知道文件格式就能打開它,這個庫能夠根據文件內容自動確定文件格式。要保存文件,使用 Image 類的 save() 方法。保存文件的時候文件名變得重要了。除非你指定格式,否則這個庫將會以文件名的擴展名作為格式保存。
載入文件,並轉化為png格式:
1
2
3
4
5
6
7
8
9
10
11
12
13
"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圖像庫可以很方便的建立縮略圖,如下:
1
2
3
4
5
6
7
# 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 方法獲取圖像的一個子矩形選區,如:
1
2
3
4
# 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 的矩形選區。這個選區現在可以被處理並且粘貼到原圖。
1
2
region = region.transpose(Image.ROTATE_180)
im.paste(region, box)
當你粘貼矩形選區的時候必須保證尺寸一致。此外,矩形選區不能在圖像外。然而你不必保證矩形選區和原圖的顏色模式一致,因為矩形選區會被自動轉換顏色。
5)分離和合並顏色通道
對於多通道圖像,有時候在處理時希望能夠分別對每個通道處理,處理完成後重新合成多通道,在Pillow中,很簡單,如下:
1
2
r,g,b = im.split()
im = Image.merge("RGB", (r,g,b))
對於split( )函數,如果是單通道的,則返回其本身,否則,返回各個通道。
6)幾何變換
對圖像進行幾何變換是一種基本處理,在Pillow中包括resize( )和rotate( ),如用法如下:
1
2
out = im.resize((128,128))
out = im.rotate(45) # degree conter-clockwise
其中,resize( )函數的參數是一個新圖像大小的元祖,而rotate( )則需要輸入順時針的旋轉角度。在Pillow中,對於一些常見的旋轉作了專門的定義:
1
2
3
4
5
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)顏色空間變換
在處理圖像時,根據需要進行顏色空間的轉換,如將彩色轉換為灰度:
1
2
cmyk = im.convert("CMYK")
gray = im.convert("L")
8)圖像濾波
5. 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')
6. python怎麼做快速圖像分割演算法
時間序列模型最常用最強大的的工具就是遞歸神經網路(recurrent neural network, RNN)。相比與普通神經網路的各計算結果之間相互獨立的特點,RNN的每一次隱含層的計算結果都與當前輸入以及上一次的隱含層結果相關。
通過這種方法,RNN的計算結果便具備了記憶之前幾次結果的特點。
7. 在python Image中可以用show()來顯示圖片,但是顯示以後,下面的代碼就不運行了,如何運行下面的代碼
Image.show()函數是這個樣子的,必須先關了圖片程序才往下走。
不使用show,如imshow(BW)在 Matlab 7.0 中,二進制圖像是一個邏輯類,僅包括 0 和 1 兩個數值。像素 0 顯示為黑色,像素 1 顯示為白色。顯示時,也可通過NOT(~)命令,對二進制圖象進行取反,使數值 0 顯示為白色;1 顯示為黑色。
例如: imshow(~BW)
擴展資料:
不使用show函數來滿足運行的需求:
import threading
import Image
class ThreadClass(threading.Thread):
def run(self):
im=Image.open('z.jpg')
im.show()
print (1)
t = ThreadClass()
t.start()
print (2)
a=input('End')
#===============================
圖像的表示原理:
最基本的物理圖像是根據矩形網格抽樣原理從連續圖像域中抽取二維灰度陣列(矩陣)得到的。也可以用長向量表示二維灰度矩陣,它是按列(或行)掃描灰度矩陣,把下一列(或行)的頭和前一列(或行)的尾相接而成。
它們的線性可逆變換同樣可以用來表示圖像。圖像的每一行由行程(具有同一灰度的鄰近像元集合)序列所組成,因此也可以用行程長度編碼(見圖像編碼)表示圖像。
8. python將圖像分割成兩半
importos
importre
importsys
importtime
importrandom
#addsystemheadershere...
#導入cv模塊
importcv2ascv
#讀取圖像,支持bmp、jpg、png、tiff等常用格式
height=0
length=0
key=0
picPath="E:\python3.4.0-amd\project\imageProcess\tamamo.jpg"
ifnotos.path.exists(picPath):
print("picturenotexists!exit!")
sys.exit()
srcImage=cv.imread(picPath)
ifsrcImageisNone:
print("readpicturefailed!exit!")
sys.exit()
size=srcImage.shape
height=size[0]
length=size[1]
print("srcImage:height(%u)length(%u)"%(height,length))
#顯示原圖
#cv.imshow("srcImage",srcImage)
#創建窗口並顯示圖像
mid=int(length/2)
leftImage=srcImage[0:height,0:mid]
cv.namedWindow("leftImage",cv.WINDOW_NORMAL)
cv.resizeWindow("leftImage",mid,height)
cv.imshow("leftImage",leftImage)
rightIamge=srcImage[0:height,mid:length]
cv.namedWindow("rightIamge",cv.WINDOW_NORMAL)
cv.resizeWindow("rightIamge",mid,height)
cv.imshow("rightIamge",rightIamge)
cv.waitKey(0)
#釋放窗口
cv.destroyAllWindows()
9. 請問如何將一條曲線進行分段線性化,有什麼matlab函數,直接用線性插值行嗎
matlab中有分段線性插值函數
假如曲線表達式為y=1/(1+x^2)
具體畫圖為
x=-5:1:5;
y=1./(1+x.^2);
x0=-5:0.05:5;
y1=interp1(x,y,x0,'linear');%求分段線性插值函數在x0上的值
plot(x0,y1,'.');%分段線性插值圖像
legend('分段線性插值曲線')
10. python 上有沒有MATLAB上blkproc函數類似的把矩陣,數組圖像分塊的函數,用於DCT變換
我在尋找有效地將圖像分成小區域,每個區域分別處理,然後重新組裝的每一個過程的結果進入GaGa的圖像處理的好辦法。 MATLAB不得不工具,這款名為blkproc(換成blockproc在新的Matlab的版本)。 在理想的世界中,將支持在輸入矩陣司之間的函數或類重疊了。在Matlab的幫助,blkproc被定義為: Blkproc B=(A,[m×n個] CodeGo.net,[mborder nborder],樂趣,...) A是你的輸入矩陣, [M n]是塊大小 [Mborder,nborder]你是邊境地區的大小(可選) 有趣的是適用於每個塊的函數 我kluged在一起的方法,但它暨awk和bug還有更好的方法。在我自己的風險,這里是我的代碼:
import numpy as np
def segmented_process(M, blk_size=(16,16), overlap=(0,0), fun=None):
rows = []
for i in range(0, M.shape[0], blk_size[0]):
cols = []
for j in range(0, M.shape[1], blk_size[1]):
cols.append(fun(M[i:i+blk_size[0], j:j+blk_size[1]]))
rows.append(np.concatenate(cols, axis=1))
return np.concatenate(rows, axis=0)
R = np.random.rand(128,128)
passthrough = lambda(x):x
Rprime = segmented_process(R, blk_size=(16,16),
overlap=(0,0),
fun=passthrough)
np.all(R==Rprime)
具體訪問http://codego.net/260720/