国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

【正經的AI on Python入門系列】1.2 斗圖工具的優化——文本寬度自適應(來做點小數據分析

fireflow / 3611人閱讀

摘要:在上一篇文章圖工具的優化實現文本居中中,我們已經實現了對插入字體的左中右對齊顯示,那因為上期文章混進去了不少語法講解,所以后面的內容就順延到這啦,哈哈哈。

在上一篇文章【圖工具的優化——實現文本居中】中,我們已經實現了對插入字體的左中右對齊顯示,那因為上期文章混進去了不少語法講解,所以后面的內容就順延到這啦,哈哈哈。

我比較長怎么辦啊?

我們的斗圖小工具,現在面臨這一個苦惱,這些文本他壞,一會長一會短的,一旦有個很長很長的,直接就捅到里面去了,根本顯示不全啊,這咋辦呢?
我稍微想了下,這個也簡單,我可以不斷的減小字號,直到我們的空白區域可以放得下:

    while (CONST_IMG_WIDTH <= textLen + 2*off_set[0]) and fontSize >= 1:
        fontSize -= 1
        imageFont = ImageFont.truetype("./resources/msyh.ttc", fontSize)
        textLen = draw.textsize(text, imageFont)[0]
        print("當前字號{},文本寬度{}".format(fontSize, textLen))

看看效果吧:

python emofigther.py 長的就會變細變細了就能塞下了嘛

效果其實還是挺好的,就是實現的方式有點太low了,而且不停的加載字體,看著就覺得開銷很大,那有沒有更優雅的辦法呢?

來做點小數據分析吧

下面我們來研究一下,字體的字號大小跟其經過PIL繪制之后的大小有什么關系,接下來我們主要會用到Numpy、matplotlib跟scipy幾個庫。
先來準備點數據樣本,通過draw.textSize函數,繪制單個字并獲取其大小:

# 準備分析數據
font_num = []
text_size = []
for i in range(1, 31):
    imageFont = ImageFont.truetype("./resources/msyh.ttc", i)
    text_size.append(draw.textsize("字", font=imageFont))
    font_num.append(i)

借助matplotlib的pyplot模塊,我們可以繪制各種圖像,先讓我們以字號為x軸,字體寬度為y軸,畫出樣本的散點圖

import matplotlib.pyplot as plt
#....
# scatter畫出散點圖,以字號為x軸,字體寬度為y軸
# 在分析前,先繪制散點圖,對大致的函數形狀進行分析
plt.scatter(list(map(lambda x: x[0], text_size)), font_num, color="b", label=u"字體寬度")

運行之后,會彈出這樣一個窗口

好的,從這個圖片上分析,我們的字號與寬度是一個完美的正相關,用函數來表示,就是

$$ y=kx+b $$

那問題來了,我們如何取得k和b兩個常數的值呢,那個說k=1,b=0的同學你坐下!我們要嚴謹,看出來了也不要說出來嘛,額,不對,就算是看出來了,但我們還是要以嚴謹的方式去證明他的!為了求出k和b兩個常數的最優解,我們需要用到scipy.optimize模塊的leastsq函數,這個函數實現了“最小二乘法”算法,通過不斷的嘗試不同的常數,求出與期望結果誤差最小的最優解,那下面就簡單介紹一下怎么用leastsq對函數進行擬合:

首先,我們要定義一個函數形狀(一元一次、一元二次、多元多次)

def func_shape(p, x):
    """定義函數形狀,哈哈哈,就是 y = kx+b 直線!
    Args:
        p: 常數
        x: 自變量
    Returns:
        函數運算求得的因變量
    """
    k,b = p
    return k*x + b

然后定義一個誤差計算函數

def func_err(p, x, y):
    """定義誤差函數
    Args:
        p: 常數
        x: 自變量
        y: 驗證因變量
    Returns:
        返回函數運算結果與驗證因變量之間的誤差值
    """
    return func_shape(p, x) - y

使用leastsq函數進行求解,獲取最優常量k、b

from scipy.optimize import leastsq

r = leastsq(func_err, p0, args=(_font_size_np[:,0], _font_num_np))
# 計算結果中的r[0]為一個元組,為求得的k和b
k, b = r[0]
# 最后我們得出結論,擬合結果為y = x
print("k=",k,"b=",b, "r=", r)


把擬合曲線也畫在圖標上:

# 畫出擬合線,以字號為X軸,函數運算結果為Y軸
plt.plot(X,func_shape((k, b), X),color="orange",label=u"字體寬度擬合",linewidth=2) 


可以看到擬合曲線完美的經過了每一個數據點,這基本就可以認定我們的擬合曲線基本上就是 y=x了,
當然,我們的樣本量現在是非常少的,也非常的規整,其實更多情況下,數據可能是這樣分布的:

這樣是不是就能體現出擬合的意義了呢?

讓我們把研究成果用在我們的代碼上:
    # 方法2:通過簡單的數據分析,我們研究出字體寬度 = 字體字號這一函數
    def char_len(text_size):
        return text_size
    # 減小字號,直到 字數*單位寬度 適應空白區域寬度
    while char_len(fontSize) * len(text) > (CONST_IMG_WIDTH - 2*off_set[0]):
        fontSize -= 1

學霸們,動起來!

如果有小伙伴們看到這個章節,對本章節描述的數據分析過程非常感興趣,而且覺得自己的數學功底非常扎實(特別是離散數學、概率、統計這方面的)你們請離開本系列文章——因為你們已經了解到了在科學計算領域,Python也是一把不錯的兵刃,而你們,被選中的魔法少女(大霧)們,可以去深入了解以下幾個庫,然后投入到轟轟烈烈的數據分析事業中去吧!

Numpy —— 為Python提供了多維數組的擴展,同時也提供了豐富的集合運算、矩陣運算、向量運算,可以說是Python科學計算的基石

matplotlib —— 可產生出版物質量的圖表的2D繪圖庫,數據可視化是數據分析不可或缺的手段之一

pandas —— 數據分析庫,包括數據框架(dataframes)等結構

Scipy —— 高級科學計算庫,提供了大量的科學計算工具及算法,例如本文用到的leastsq最小二乘法求解多項式算法(媽媽再也不用擔心我要重復造輪子了!)

這些庫的相關資料都非常的好找,而小弟又才疏學淺,就不再對它們在作過多展開了!

因為作者數學水平太差了,我們下期換個方向玩

按照慣例,放上此次的源碼:
GitHub
其中的char_analysis.py即為本文所屬的函數擬合例子

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/42121.html

相關文章

  • 正經AI on Python入門系列】1.1斗圖工具優化——實現文本居中(還混進了一些語法基礎

    摘要:大家還記得上一篇文章來學點吧從一個斗圖小工具開始中最后提到的幾個問題么,我們這次就來解決一下其中難度最大的一個文本居中看,我把代碼優化了上次之后,我偷偷把代碼優化了,現在的方法長這樣創建表情圖調試用生成表情包對的,我把那些老長老長 showImg(https://segmentfault.com/img/bVbeDVL?w=250&h=250); 大家還記得上一篇文章0.來學點Pyth...

    Luosunce 評論0 收藏0
  • 正經AI on Python入門系列】0.來學點Python吧!從一個斗圖工具開始

    摘要:因此,本文將會以一些正經的嚴謹的有深度的大概吧的課題,慢慢的接觸人工智能的相關知識。 Before The Beginning ????近年,技術圈炒的最火的兩個話(ba)題(gua)不外乎就是人工智障智能以及炒幣區塊鏈了,這個系列文章我主要以一個小菜鳥的角度一步一步的對人工智能的相關知識做一點了解,也算是一個顫顫巍巍追著AI浪潮公交車的社會主義五好青年,咳咳,扯遠了...其實對于人工...

    趙連江 評論0 收藏0
  • 深度學習

    摘要:深度學習在過去的幾年里取得了許多驚人的成果,均與息息相關。機器學習進階筆記之一安裝與入門是基于進行研發的第二代人工智能學習系統,被廣泛用于語音識別或圖像識別等多項機器深度學習領域。零基礎入門深度學習長短時記憶網絡。 多圖|入門必看:萬字長文帶你輕松了解LSTM全貌 作者 | Edwin Chen編譯 | AI100第一次接觸長短期記憶神經網絡(LSTM)時,我驚呆了。原來,LSTM是神...

    Vultr 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<