Ⅰ 數據蛙-python進階
這是漫長的一周,本周完成了Python的進階模塊,主要是pandas、numpy、matplotlib、seaborn、pyecharts這些模塊的學習以及一個實際的案例:商品銷售情況分析,之前一直覺得課程難度不夠,但到這一周難度就大大提高了。尤其是案例練習中的RFM模型和用戶生命周期建立,看懂不難但是自差首己寫一直出錯,在不斷出錯不斷嘗試中知識得到了積累,另外可視化部分沒有什麼練習題,希望後面可以加上一些這方面的練習,接下來分模塊來總結一下學習的內容。
重新設置索引:df.set_index()
Series格式轉換為DataFrame:df.to_frame()
文件讀取:pd.read_csv(filepath, header = 0,skiprows=[1,2])
使用位禪慶源置做索引:df.loc[0] 使用列表做索引:df.loc[[0,1,2]]
使用切片做索引:df.loc[0:4] 使用bool類型索引:df[df['年齡']>30]
loc 是基於索引值的,切片是左閉右閉的
iloc 是基於位置的,切片是左閉右開的
修改列索引:df.rename(columns={'姓名':'name', '年齡':'age'},inplace=True)
替換一個值:df.replace({'name':{'小明':'xiaoming'}},inplace=True)
對數據進行排序:df.sort_values('age')
累加求和:df.cumsum(0)
刪除列:del df['player'] 刪除行:df.drop(labels=0) labels 是行列的名字
數據拼接:pd.concat([left,right],axis=1)
# 指定列進行關聯,默認是 inner join result = pd.merge(left,right,on='key')
#多個關聯條件:result = pd.merge(left, right, on=['key1', 'key2'])
#左連接:result = pd.merge(left, right, how='left', on=['key1', 'key2'])
# 列名不一樣的關聯:pd.merge(left,right,left_on = ['key1','key2'],right_on = ['key3','key4'])
#單個分組:groups = df.groupby('district')
# 作用多個聚合函數:groups.agg([np.mean,np.sum,np.std])
# 針對具體列聚合 groups.age.agg([np.mean,np.sum,np.std])
# 不同列不同聚合函數 groups.agg({"age":np.mean,"novip_buy_times":np.sum})
分組後該列值求和顯示:groups['vip_buy_times'].transform('sum')
通常用於求佔比:transform(lambda x: x /sum(x))
# 填充指定值:np.full([3,4],1)
# 起始為10,5為步長,30為結賀態尾取不到:np.arange(10, 30, 5)
#隨機矩陣:np.random.random((2,3))
# 平均劃分:np.linspace( 0, 2*pi, 100 )
# 類型及轉換:vector.astype('float')
# 多維變一維:matrix.ravel()
# 矩陣的擴展:a = np.arange(0, 40, 10) b = np.tile(a, (3, 5)) # 行變成3倍,列變成5倍
# 水平拼接:np.hstack((a,b)) 豎直拼接:np.vstack((a,b))
# 豎直分割:np.hsplit(a,3) #水平分割:np.vsplit(a,3)
8. Select the data in rows [3, 4, 8] and in columns ['animal', 'age'].
A:df.loc[df.index[[3,4,8]],['animal','age']]
行採用位置,列採用普通索引,這里利用index函數將位置變化為具體的普通索引,再利用loc函數
19. The 'priority' column contains the values 'yes' and 'no'. Replace this column with a column of boolean values: 'yes' should be True and 'no' should be False
A1:df['priority'].replace(['yes','no'],[True,False],inplace=True) 用replace函數替換
A2:df['priority'] = df['priority'].map({'yes': True, 'no': False}) 用map函數替換
最大最小值的索引:df.idxmax、df.idxmin
找出最大最小的前N個數:nlargest()和nsmallest()
將原表分組 並設置分段區間 pd.cut(df['A'], np.arange(0, 101, 10))
resample函數 日期重采樣:s.resample('M').mean()
TimeGrouper 重組:s.groupby(pd.TimeGrouper('4M')).idxmax()
split 分割函數:temp = df['From_To'].str.split('_', expand=True) True為DataFrame
兩個DataFrame拼接用join:df = df.join(temp)
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #用來正常顯示中文標簽
plt.rcParams['axes.unicode_minus']=False #用來正常顯示負號
%matplotlib inline 直接顯示
折線圖:plt.plot(x,y,color = 'r')
柱狀圖:plt.bar(x,y) plt.barh(x,y) 多個bar x設置不同 堆積圖 bottom設置不同
散點圖:plt.scatter(x, y, c=colors, alpha=0.5, s = area)
直方圖:plt.hist(a,bins= 20) bin代表分隔的最小單位
plt.legend() 顯示圖例
for a,b in zip(X+W[i],data[i]):
plt.text(a,b,"%.0f"% b,ha="center",va= "bottom") 添加數據標簽
plt.annotate('注釋文本',xy=(1, np.sin(1)),xytext=(2, 0.5), fontsize=16,arrowprops=dict(arrowstyle="->")) 添加註釋文本
plt.xlabel("Group") x軸標題
plt.ylabel("Num") y軸標題
fig, axes = plt.subplots(nrows=2, ncols=2,facecolor='darkslategray') 繪制多個圖形
axes[0,0] axes[0,1] axes[1,0] axes[1,1]
pylab.rcParams['figure.figsize'] = (10, 6) # 調整圖片大小
動態展示圖表
from pyecharts.charts import Bar
from pyecharts import options as opts
** pyecharts 繪圖的五個步驟:**
創建圖形對象:bar = Bar()
添加繪圖數據:bar.add_xaxis(["襯衫", "毛衣", "領帶", "褲子", "風衣", "高跟鞋", "襪子"])
bar.add_yaxis("商家A", [114, 55, 27, 101, 125, 27, 105])
bar.add_yaxis("商家B", [57, 134, 137, 129, 145, 60, 49])
配置系列參數:對標簽、線型等的一些設置
配置全局參數:bar.set_global_opts(title_opts=opts.TitleOpts(title="銷售情況"))
渲染圖片:生成本地 HTML 文件 bar.render("mycharts.html") bar.render()
notebook 渲染:bar.render_notebook()
bar = (Bar()
.add_xaxis(["襯衫", "毛衣", "領帶", "褲子", "風衣", "高跟鞋", "襪子"])
.add_yaxis("商家A", [114, 55, 27, 101, 125, 27, 105])
.add_yaxis("商家B", [57, 134, 137, 129, 145, 60, 49])
.set_global_opts(title_opts=opts.TitleOpts(title="某商場銷售情況"))
)
bar.render_notebook()
柱狀圖:Bar()
條形圖:bar.reversal_axis() #翻轉XY軸,將柱狀圖轉換為條形圖
折線圖:from pyecharts.charts import Line line=Line()
餅圖:from pyecharts.charts import Page, Pie Pie()
轉換日期類型:df['order_dt']=pd. to_datetime (df.order_dt,format="%Y%m%d")
將日期轉換為月為單位:df['month']=df.order_dt.values. astype('datetime64[M]') 所有日期顯示為當月第一天
去除日期單元值:order_diff/ np.timedelta64(1,'D')
過濾部分極值:grouped_user.sum() .query('order_procts<100') .order_amount
數據透視表:rfm=df.pivot_table( index ='user_id', values =['order_procts','order_amount'], aggfunc ={'order_amount':'sum','order_procts':'sum'})
map() 方法是pandas.series.map()方法, 對DF中的元素級別的操作, 可以對df的某列或某多列
applymap(func) 也是DF的屬性, 對整個DF所有元素應用func操作
purchase_r=pivoted_counts.applymap(lambda x: 1 if x>1 else np.NaN if x==0 else 0)
apply(func) 是DF的屬性, 對DF中的行數據或列數據應用func操作,也可用於Series
apply(lambda x:x.cumsum()/x.sum()) 累計佔比
apply(lambda x:x/x.sum(),axis=0) 每一列中每行數據佔比
下周開始進入數據分析思維的課程,很期待後面的課程以及項目,加油!
Ⅱ Python:這有可能是最詳細的PIL庫基本概念文章了
PIL有如下幾個模塊:Image模塊、ImageChops模塊、ImageCrackCode模塊、ImageDraw模塊、ImageEnhance模塊、ImageFile模塊、ImageFileIO模塊、ImageFilter模塊、ImageFont模塊、ImageGrab模塊、ImageOps模塊、ImagePath模塊、ImageSequence模塊、ImageStat模塊、ImageTk模塊、ImageWin模塊、PSDraw模塊
啊啊啊啊怎麼這么多模塊啊~~~!!!!
別擔心我為你一一講解
Image模塊提供了一個相同名稱的類,即image類,用於表示PIL圖像。
Image模塊是PIL中最重要的模塊 ,比如創建、打開、顯示、保存圖像等功能,合成、裁剪、濾波等功能,獲取圖像屬性功能,如圖像直方圖、通道數等。
Image模塊的使用如下:
ImageChops模塊包含一些算術圖形操作,這些操作可用於諸多目的,比如圖像特效,圖像組合,演算法繪圖等等,通道操作只用於8點陣圖像。
ImageChops模塊的使用如下:
由於圖像im_p是im的復制過來的,所以它們的差為0,圖像im_diff顯示時為黑圖。
ImageCrackCode模塊允許用戶檢測和測量圖像的各種特性。 這個模塊只存在於PIL Plus包中。
因為我目前安裝的PIL中沒有包含這個模塊。所以就不詳細介紹了
ImageDraw模塊為image對象提供了基本的圖形處理功能。 例如,它可以創建新圖像,注釋或潤飾已存在圖像,為web應用實時產生各種圖形。
ImageDraw模塊的使用如下:
在del draw前後顯示出來的圖像im是完全一樣的,都是在原有圖像上畫了兩條對角線。
原諒我的報錯
ImageEnhance模塊包括一些用於圖像增強的類。它們分別為 Color類、Brightness類、Contrast類和Sharpness類。
ImageEnhance模塊的使用如下:
圖像im0的亮度為圖像im的一半。
ImageFile模塊為圖像打開和保存功能提供了相關支持功能。另外,它提供了一個Parser類,這個類可以一塊一塊地對一張圖像進行解碼(例如,網路聯接中接收一張圖像)。這個類的介面與標準的sgmllib和xmllib模塊的介面一樣。
ImageFile模塊的使用如下:
因為所打開圖像大小大於1024個byte,所以報錯:圖像不完整。
所以大家想看的可以自行去找一個小一點的圖看一下
ImageFileIO模塊用於從一個socket或者其他流設備中讀取一張圖像。 不贊成使用這個模塊。 在新的code中將使用ImageFile模塊的Parser類來代替它。
ImageFilter模塊包括各種濾波器的預定義集合,與Image類的filter方法一起使用。該模塊包含這些圖像增強的濾器:BLUR,CONTOUR,DETAIL,EDGE_ENHANCE,EDGE_ENHANCE_MORE,EMBOSS,FIND_EDGES,SMOOTH,SMOOTH_MORE和SHARPEN。
ImageFilter模塊的使用如下:
ImageFont模塊定義了一個同名的類,即ImageFont類。這個類的實例中存儲著bitmap字體,需要與ImageDraw類的text方法一起使用。
PIL使用自己的字體文件格式存儲bitmap字體。用戶可以使用pilfont工具包將BDF和PCF字體描述器(Xwindow字體格式)轉換為這種格式。
PIL Plus包中才會支持矢量字體。
ImageGrab模塊用於將屏幕上的內容拷貝到一個PIL圖像內存中。 當前的版本只在windows操作系統上可以工作。
ImageGrab模塊的使用如下:
圖像im顯示出筆記本當前的窗口內容,就是類似於截圖的工具
ImageOps模塊包括一些「ready-made」圖像處理操作。 它可以完成直方圖均衡、裁剪、量化、鏡像等操作 。大多數操作只工作在L和RGB圖像上。
ImageOps模塊的使用如下:
圖像im_flip為圖像im垂直方向的鏡像。
ImagePath模塊用於存儲和操作二維向量數據。Path對象將被傳遞到ImageDraw模塊的方法中。
ImagePath模塊的使用如下:
ImageSequence模塊包括一個wrapper類,它為圖像序列中每一幀提供了迭代器。
ImageSequence模塊的使用如下:
後面兩次show()函數調用,分別顯示第1張和第11張圖像。
ImageStat模塊計算一張圖像或者一張圖像的一個區域的全局統計值。
ImageStat模塊的使用如下:
ImageTk模塊用於創建和修改BitmapImage和PhotoImage對象中的Tkinter。
ImageTk模塊的使用如下:
這個是我一直不太懂的有沒有大佬能幫我解決一下在線等~急!
PSDraw模塊為Postscript列印機提供基本的列印支持。用戶可以通過這個模塊列印字體,圖形和圖像。
PIL中所涉及的基本概念有如下幾個: 通道(bands)、模式(mode)、尺寸(size)、坐標系統(coordinate system)、調色板(palette)、信息(info)和濾波器(filters)。
每張圖片都是由一個或者多個數據通道構成。PIL允許在單張圖片中合成相同維數和深度的多個通道。
以RGB圖像為例,每張圖片都是由三個數據通道構成,分別為R、G和B通道。而對於灰度圖像,則只有一個通道。
對於一張圖片的通道數量和名稱,可以通過getbands()方法來獲取。getbands()方法是Image模塊的方法,它會返回一個字元串元組(tuple)。該元組將包括每一個通道的名稱。
Python的元組與列表類似,不同之處在於元組的元素不能修改,元組使用小括弧,列表使用方括弧,元組創建很簡單,只需要在括弧中添加元素,並使用逗號隔開即可。
getbands()方法的使用如下:
圖像的模式定義了圖像的類型和像素的位寬。當前支持如下模式:
1:1位像素,表示黑和白,但是存儲的時候每個像素存儲為8bit。
L:8位像素,表示黑和白。
P:8位像素,使用調色板映射到其他模式。
I:32位整型像素。
F:32位浮點型像素。
RGB:3x8位像素,為真彩色。
RGBA:4x8位像素,有透明通道的真彩色。
CMYK:4x8位像素,顏色分離。
YCbCr:3x8位像素,彩色視頻格式。
PIL也支持一些特殊的模式,包括RGBX(有padding的真彩色)和RGBa(有自左乘alpha的真彩色)。
可以通過mode屬性讀取圖像的模式。其返回值是包括上述模式的字元串。
mode 屬性 的使用如下:
通過size屬性可以獲取圖片的尺寸。這是一個二元組,包含水平和垂直方向上的像素數。
mode屬性的使用如下:
PIL使用笛卡爾像素坐標系統,坐標(0,0)位於左上角。注意:坐標值表示像素的角;位於坐標(0,0)處的像素的中心實際上位於(0.5,0.5)。
坐標經常用於二元組(x,y)。長方形則表示為四元組,前面是左上角坐標。例如:一個覆蓋800x600的像素圖像的長方形表示為(0,0,800,600)。
調色板模式 ("P")使用一個顏色調色板為每個像素定義具體的顏色值
使用info屬性可以為一張圖片添加一些輔助信息。這個是字典對象。載入和保存圖像文件時,多少信息需要處理取決於文件格式。
info屬性的使用如下:
對於將多個輸入像素映射為一個輸出像素的幾何操作,PIL提供了4個不同的采樣濾波器:
NEAREST:最近濾波。 從輸入圖像中選取最近的像素作為輸出像素。它忽略了所有其他的像素。
BILINEAR:雙線性濾波。 在輸入圖像的2x2矩陣上進行線性插值。注意:PIL的當前版本,做下采樣時該濾波器使用了固定輸入模板。
BICUBIC:雙立方濾波。 在輸入圖像的4x4矩陣上進行立方插值。注意:PIL的當前版本,做下采樣時該濾波器使用了固定輸入模板。
ANTIALIAS:平滑濾波。 這是PIL 1.1.3版本中新的濾波器。對所有可以影響輸出像素的輸入像素進行高質量的重采樣濾波,以計算輸出像素值。在當前的PIL版本中,這個濾波器只用於改變尺寸和縮略圖方法。
注意:在當前的PIL版本中,ANTIALIAS濾波器是下采樣 (例如,將一個大的圖像轉換為小圖) 時唯一正確的濾波器。 BILIEAR和BICUBIC濾波器使用固定的輸入模板 ,用於固定比例的幾何變換和上采樣是最好的。Image模塊中的方法resize()和thumbnail()用到了濾波器。
resize()方法的定義為:resize(size, filter=None)=> image
resize()方法的使用如下:
對參數filter不賦值的話,resize()方法默認使用NEAREST濾波器。如果要使用其他濾波器可以通過下面的方法來實現:
thumbnail ()方法的定義為:im.thumbnail(size, filter=None)
thumbnail ()方法的使用如下:
這里需要說明的是,方法thumbnail()需要保持寬高比,對於size=(200,200)的輸入參數,其最終的縮略圖尺寸為(182, 200)。
對參數filter不賦值的話,方法thumbnail()默認使用NEAREST濾波器。如果要使用其他濾波器可以通過下面的方法來實現:
Ⅲ 怎麼用python進行簡單的圖像處理
所謂簡單的圖像處理,就是對像素數據進行點處理。
下面是具體步驟。
讀取圖片:
# -*- coding: utf-8 -*-
import cv2
import numpy as np
img = cv2.imread("C:/Users/Administrator/Desktop/ball.png")
cv2.imshow("a",img)
cv2.waitKey(0)
cv2.imshow("a",img)
打開一個圖片窗口。
python讀取圖片,實際上是讀取了離散的圖片數據:
print(img)
運行,就會給出圖片數據。
顯示反色圖片,只要進行簡單的計算:
255-img
這是2*img的效果。
分離通道,圖片的第一個通道是:
img[:,:,0]
成圖是灰度圖。
第二個通道的灰度圖:
img[:,:,1]
第三個通道的灰度圖:
img[:,:,2]
Ⅳ 利用Python進行數據分析(9)-重采樣resample和頻率轉換
Python-for-data-重新采樣和頻率轉換
重新采樣指的是將時尺耐間序列從一個頻率轉換到另一個頻率的過程。
但是也並不是所有的采樣方式都是屬於上面的兩種
pandas中使用resample方法來實現頻率轉換,下面是resample方法的參數詳解:
將數據聚合到一個規則的低頻上,例如將時間轉換為每個月,"M"或者"BM",將數據分成一個月的時間間隔。
每個間隔是半閉合的,一個數據只能屬於一個時間間隔。時間間隔的並集必須是整個時間幀
默認情況下,左箱體邊界是包含的。00:00的值是00:00到00:05間隔內的值
產生的時間序列按照每個箱體左邊的時間戳被標記。
傳遞<span class="mark">label="right"</span>可以使用右箱體邊界標記時間序列
向loffset參數傳遞字元串或者日期偏置
在金融數據中,為每個數據桶計算4個值是常見知困物的問題:
通過<span class="girk">ohlc聚合函數</span>能夠得到四種聚合值列的DF數據
低頻搭液轉到高頻的時候會形成缺失值
ffill() :使用前面的值填充, limit 限制填充的次數
Ⅳ 根據抓來的數據包 怎麼用python 實現圖片上
以下是實現上述思路的方法:
1. 模板文件
<!DOCTYPEhtml>
<htmllang="en">
<head>
<metacharset="UTF-8">
<title>Title</title>
</head>
<body>
<div>
<formaction="">
{%csrf_token%}
<h3>用戶注冊</h3>
<p>用戶名:<inputtype="text"name="userName"></p>
<p>密碼:<inputtype="password"name="password"></p>
<p>郵箱:<inputtype="text"name="email"></p>
<inputid="avatar"type="text"value="/static/images/sample.png"name="avatar">{#實際應用中要將該input標簽隱藏,display:none;#}
<p><inputtype="submit"value="注冊"></p>
</form>
<div>
<inputid="avatarSlect"type="file">
<imgid="avatarPreview"src="/static/images/sample.png"title="點擊更換圖片">
</div>
</div>
</body>
<scriptsrc="/static/jquery-3.2.1.js"></script>
<script>
$(function(){
bindAvatar();
});
functionbindAvatar(){
if(window.URL.createObjectURL){
bindAvatar3();
}elseif(window.FileReader){
bindAvatar2();
}else{
bindAvatar1();
}
}
/*Ajax上傳至後台並返回圖片的url*/
functionbindAvatar1(){
$("#avatarSlect").change(function(){
varcsrf=$("input[name='csrfmiddlewaretoken']").val();
varformData=newFormData();
formData.append("csrfmiddlewaretoken",csrf);
formData.append('avatar',$("#avatarSlect")[0].files[0]);/*獲取上傳的圖片對象*/
$.ajax({
url:'/upload_avatar/',
type:'POST',
data:formData,
contentType:false,
processData:false,
success:function(args){
console.log(args);/*伺服器端的圖片地址*/
$("#avatarPreview").attr('src','/'+args);/*預覽圖片*/
$("#avatar").val('/'+args);/*將服務端的圖片url賦值給form表單的隱藏input標簽*/
}
})
})
}
/*window.FileReader本地預覽*/
functionbindAvatar2(){
console.log(2);
$("#avatarSlect").change(function(){
varobj=$("#avatarSlect")[0].files[0];
varfr=newFileReader();
fr.onload=function(){
$("#avatarPreview").attr('src',this.result);
console.log(this.result);
$("#avatar").val(this.result);
};
fr.readAsDataURL(obj);
})
}
/*window.URL.createObjectURL本地預覽*/
functionbindAvatar3(){
console.log(3);
$("#avatarSlect").change(function(){
varobj=$("#avatarSlect")[0].files[0];
varwuc=window.URL.createObjectURL(obj);
$("#avatarPreview").attr('src',wuc);
$("#avatar").val(wuc);
{#$("#avatarUrl").load(function(){#}/*當圖片載入後釋放內存空間,但在jQuery3.2.1中會報錯。瀏覽器關閉後也會自動釋放*/
{#window.URL.revokeObjectURL(wuc);#}
{#})#}
})
}
</script>
</html>
2. 視圖函數
upload_avatar.py
fromdjango.shortcutsimportrender,HttpResponse
deftest(request):
returnrender(request,'test.html')
defupload_avatar(request):
file_obj=request.FILES.get('avatar')
file_path=os.path.join('static/images',file_obj.name)
withopen(file_path,'wb')asf:
forchunkinfile_obj.chunks():
f.write(chunk)
returnHttpResponse(file_path)
3. 路由系統
urls.py
fromdjango.conf.urlsimporturl
fromdjango.contribimportadmin
urlpatterns=[
url(r'^admin/',admin.site.urls),
url(r'^upload_avatar/',homeViews.upload_avatar),#上傳頭像
url(r'^test/',homeViews.test),#測試頁面
]
Ⅵ python數據採集是什麼
數據採集(DAQ),又稱數據獲取,是指從感測器和其它待測設備等模擬和數字被測單元中自動採集非電量或者電量信號,送到上位機中進行分析,處理。數據採集系統是結合基於計算機或者其他專用測試平台的測量軟硬體產品來實現靈活的、用戶自定義的測量系統。採集一般是采樣方式,即隔一定時間(稱采樣周期)對同一點數據重復採集。採集的數據大多是瞬時值,也可是某段時間內的一個特徵值。
網路爬蟲是用於數據採集的一門技術,可以幫助我們自動地進行信息的獲取與篩選。從技術手段來說,網路爬蟲有多種實現方案,如PHP、Java、Python ...。那麼用python 也會有很多不同的技術方案(Urllib、requests、scrapy、selenium...),每種技術各有各的特點,只需掌握一種技術,其它便迎刃而解。同理,某一種技術解決不了的難題,用其它技術或方依然無法解決。網路爬蟲的難點並不在於網路爬蟲本身,而在於網頁的分析與爬蟲的反爬攻克問題。
python學習網,免費的在線學習python平台,歡迎關注!
Ⅶ ❤️【Python從入門到精通】(二十七)更進一步的了解Pillow吧!
本文是接上一篇 ❤️【Python從入門到精通】(二十六)用Python的PIL庫(Pillow)處理圖像真的得心應手❤️ 進一步介紹Pillow庫的使用, 本文將重點介紹一些高級特性:比如如何利用Pillow畫圖形(圓形,正方形),介紹通過Pillow庫給圖片添加水印;同時對上一篇文章未介紹的常用知識點進行補充說明。希望對讀者朋友們有所幫助。
上一篇文章已經介紹了Image模塊,但是介紹的還不夠全面,例如如何從網頁中讀取圖片沒有介紹到,如何裁剪圖片都沒有介紹到。
讀取網頁中的圖片的基本實現方式是:首先利用requests庫讀取當前圖片鏈接的內容,接著將內容轉成二進制數據,在通過open方法將該二進制數據,最後通過save方法進行保存。
讀取結果是:
通過crop方法可以從圖片中裁剪出一個指定大小的區域。裁取的區域范圍是 (left, upper, right, lower) 比如從某個寬高都是400的圖片中裁剪一個是寬高都是100的正方形區域,只需要指定裁剪區域的坐標是: (0, 0, 100, 100)
有裁剪還有一個方法就是重新設置圖片大小的方法 resize,比如將前面400 400的圖片 修改成 300 200,只需要調用resize方法
通過 convert方法進行圖片模式的轉換
前面介紹的ImageDraw庫,只是介紹了利用它來向圖片寫入文本,其實ImageDraw模塊還有一個更有用的途徑,就是可以通過它來畫各種圖形。
首先創建一個600*600的畫布。然後再畫布中畫出一個正方形,畫直線的方法是 line方法。
ImageDraw.line(xy, fill=None, width=0, joint=None)
在xy的坐標之間畫一條直線
xy--> 在兩個坐標點之間畫一條直線,坐標點的傳入方式是[(x, y), (x, y), ...]或者[x, y, x, y, ...]
fill--> 直線的顏色
width--> 直線的寬度
畫一個邊框寬度為2px,顏色為藍色的,面積為400*400的正方形。
ImageDraw.arc(xy, start, end, fill=None, width=0)
在給定的區域范圍內,從開始角到結束角之間繪制一條圓弧
xy--> 定義邊界框的兩個點,傳入的格式是[ (x0, y0), (x1, y1)] 或者 [x0, y0, x1, y1] ,其中 x1>=x0,y1>=y0
start --> 起始角度,以度為單位,從3點鍾開始順時針增加
end--> 結束角度,以度為單位
fill--> 弧線的顏色
width-->弧線的寬度
這里就是畫了一個半圓,如果結束角度是360度的話則就會畫一個完整的圓。
畫圓通過ImageDraw.ellipse(xy, fill=None, outline=None, width=1) 方法,該方法可以畫出一個給定范圍的圓
xy--> 定義邊界框的兩個點,傳入的格式是[ (x0, y0), (x1, y1)] 或者 [x0, y0, x1, y1] ,其中 x1>=x0,y1>=y0
outline--> 輪廓的顏色
fill ---> 填充顏色
width--> 輪廓的寬度
ImageDraw.chord(xy, start, end, fill=None, outline=None, width=1) 方法用來畫半圓,跟arc()方法不同的是它會用直線將起始點和結束點連接起來
xy--> 定義邊界框的兩個點,傳入的格式是[ (x0, y0), (x1, y1)] 或者 [x0, y0, x1, y1] ,其中 x1>=x0,y1>=y0
outline--> 輪廓的顏色
fill ---> 填充顏色
width--> 輪廓的寬度
ImageDraw.pieslice(xy, start, end, fill=None, outline=None, width=1)
類似於arc()方法,不過他會在端點和圓點之間畫直線
xy--> 定義邊界框的兩個點,傳入的格式是[ (x0, y0), (x1, y1)] 或者 [x0, y0, x1, y1] ,其中 x1>=x0,y1>=y0
start --> 起始角度,以度為單位,從3點鍾開始順時針增加
end--> 結束角度,以度為單位
fill--> 弧線的顏色
width-->弧線的寬度
ImageDraw.rectangle(xy, fill=None, outline=None, width=1)
xy--> 在兩個坐標點之間畫一條直線,坐標點的傳入方式是[(x, y), (x, y), ...]或者[x, y, x, y, ...]
outline--> 輪廓的顏色
fill--> 填充的顏色
width--> 輪廓線的寬度
ImageDraw.rounded_rectangle(xy, radius=0, fill=None, outline=None, width=1) 該方法可以畫一個圓角矩形
xy--> 在兩個坐標點之間畫一條直線,坐標點的傳入方式是[(x, y), (x, y), ...]或者[x, y, x, y, ...]
radius--> 角的半徑
outline--> 輪廓的顏色
fill--> 填充的顏色
width--> 輪廓線的寬度
這里有個問題,就是畫好的圖形如何從Image中扣出來呢?
ImageEnhance模塊主要是用於設置圖片的顏色對比度亮度銳度等啥的,增強圖像。
原始圖像
ImageFilter模塊主要用於對圖像進行過濾,增強邊緣,模糊處理,該模塊的使用方式是 im.filter(ImageFilter) 。
其中ImageFilter按照需求傳入指定的過濾值。
下面一個個試下效果
4.邊緣增強
ImageGrab模塊主要用於對屏幕進行截圖,通過grab方法進行截取,如果不傳入任何參數則表示全屏幕截圖,否則是截取指定區域的圖像。其中box格式是:(x1,x2,y1,y2)
利用Pillow庫可以輕易的對圖像增加水印
首先,用PIL的Image函數讀取圖片
接著,新建一張圖(尺寸和原圖一樣)
然後,在新建的圖象上用PIL的ImageDraw把字給畫上去,字的顏色從原圖處獲取。
原圖
添加文字後的效果圖
本文詳細介紹了Pillow庫的使用,希望對讀者朋友們有所幫助。
Pillow官方文檔
需要獲取源碼的小夥伴可以關注下方的公眾號,回復【python】
Ⅷ 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尋找背景圖片的最小重復單元
這個問題跟image registration很相似 ,其實就是假設圖像A和圖像B之間存在一個平移(以及旋轉)關系 ,使得平移後A和B重合的部分差別最小。