0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

使用Python進(jìn)行圖像處理

新機(jī)器視覺 ? 來源:磐創(chuàng)AI ? 2024-11-07 10:14 ? 次閱讀

來源:磐創(chuàng)AI

下面是一個關(guān)于使用Python在幾行代碼中分析城市輪廓線的快速教程。

說一句顯而易見的話:輪廓線很美。

在本文中,我們將學(xué)習(xí)如何從圖片中獲取輪廓線輪廓。

讓我們開始吧。

0.理念

這個想法很簡單。為了檢測輪廓線,我們只檢測天空并拍攝互補(bǔ)圖像。

在你之前看到的示例中,我們真正做的是識別天空。下一步當(dāng)然是獲取蒙版圖像。

那么,為什么探測天空比探測摩天大樓更容易呢?

好吧,這個概念是天空的圖片是相對平坦的。另一方面,摩天大樓是顏色、形狀、窗戶、水泥等的混合體。

從數(shù)學(xué)上講,天空的方差比摩天大樓的方差小,并且期望該參數(shù)在區(qū)分天空和摩天大樓時起決定性作用。

我想用一個例子來證明我所說的話。讓我們拍下這張照片。

太棒了現(xiàn)在,讓我們在這個區(qū)域修剪這張圖片:

現(xiàn)在,讓我們從0到50之間取一部分并打印標(biāo)準(zhǔn)偏差:

該方差變化可以使用二階導(dǎo)數(shù)來檢測。

當(dāng)我們討論離散二維情況時,我們實際上是在討論拉普拉斯算子。拉普拉斯算子可以被視為卷積,這只是使用泰勒近似的導(dǎo)數(shù)的定義。

進(jìn)入下一節(jié)的主題。

1.算法

執(zhí)行圖(1)中所示操作的算法如下:

52b7469c-909b-11ef-a511-92fbcf53809c.png

我明白這是一團(tuán)糟。讓我一步一步地解釋一下。

1.1將圖像轉(zhuǎn)換為黑白

我知道你知道這一切。但重要的是要說明我們?yōu)槭裁匆@樣做。正如你所知,當(dāng)你將它們應(yīng)用于矩陣時,所有的模糊步驟和過濾都是有意義的。彩色圖像在技術(shù)上是一個張量,因為它具有行數(shù)X列數(shù)X 3個通道值(紅、綠和藍(lán))。B&W圖像是由行數(shù)X列數(shù)組成的矩陣。

將此應(yīng)用于彩色圖像的一個簡單方法是重復(fù)上述相同的過程三次,但我認(rèn)為沒有必要。最終,即使使用B&W圖像,我們也能分辨出輪廓線。

1.2模糊步驟

中值和歸一化濾波器步驟都是用于在保持邊的同時對信號的噪聲進(jìn)行濾波的步驟。

1.3拉普拉斯濾波器

拉普拉斯濾波器被認(rèn)為是離散空間的二階時間導(dǎo)數(shù)。

為什么我們首先需要二階時間導(dǎo)數(shù)?

我們說過,天空和摩天大樓之間的標(biāo)準(zhǔn)差是不同的。這種標(biāo)準(zhǔn)差的變化發(fā)生在一個特定的點(diǎn)上,即圖像(和摩天大樓)的邊緣。

所以我們希望看到圖像的快速變化。特別是,我們希望變化最大。這意味著我們需要二階導(dǎo)數(shù)為空的點(diǎn)(或點(diǎn)的鄰居)。

當(dāng)我們討論離散二維情況時,我們實際上是在討論拉普拉斯算子。拉普拉斯算子可以被視為卷積,這只是使用泰勒近似的導(dǎo)數(shù)的定義。

二階導(dǎo)數(shù)是這樣的:

52ecd17c-909b-11ef-a511-92fbcf53809c.png

這是一個核,我們將在圖像上運(yùn)行,它將為我們提供二階導(dǎo)數(shù)圖像。

1.4應(yīng)用1/0閾值

我們不關(guān)心二階導(dǎo)數(shù)是正還是負(fù)。我們所關(guān)心的只是我們有0的一小部分,因為這是我們認(rèn)為的邊緣。

這就是為什么我們應(yīng)用這個1/0閾值。

1.5侵蝕濾波器

侵蝕濾波器是我們用來平滑圖像的東西。這背后的想法是,我們希望使圖像更清晰。用更專業(yè)的話來說,有一個核在圖像上傳遞,并用它們的最小值替換值。同樣,由于我們現(xiàn)在有一張1/0的圖像,它只是讓我們的圖像更清晰。

1.6將掩碼設(shè)置為0,直到找到最后一個索引

這一步有點(diǎn)難解釋,但很容易理解。完成所有這些操作后,圖像的一列中可能有一個0和1的序列。這沒有太多意義,因為你不能再擁有“skyscraper-sky-skyscraper again”這樣的東西了。因此,我們在列中找到值為0的最大索引,并將所有值設(shè)置為0,直到找到該值。那么,其他的都是0。

2.實際實現(xiàn)

這解釋起來有點(diǎn)長,但非常容易實現(xiàn)。

讓我們循序漸進(jìn):

importnumpyasnp
importpandasaspd
fromosimportlistdir
fromPILimportImage
importmatplotlib.pyplotasplt
fromos.pathimportisfile,join
importcv2
fromscipy.signalimportmedfilt
fromscipyimportndimage
importnumpyasnp
frommatplotlibimportpyplotasplt
importos
fromsklearn.metricsimportplot_confusion_matrix
fromsklearn.metricsimportconfusion_matrix

2.1導(dǎo)入庫:

mypath='data/images'
subfolders=[f.pathforfinos.scandir(mypath)iff.is_dir()]
images=[]
images_baw=[]
labels=[]
label=0
size=256
string_labels=[]
forfolderinsubfolders:
onlyfiles=[fforfinlistdir(folder)ifisfile(join(folder,f))]
forfileinonlyfiles:
image_file=Image.open(folder+'/'+file).resize((size,size))
images.append(np.array(image_file))
images_baw.append(np.array(image_file.convert('1')))
labels.append(label)
string_labels.append(folder.split('/')[-1])
label=label+1
labels=np.array(labels)
images=np.array(images)
image_baw=np.array(images_baw)

2.1導(dǎo)入數(shù)據(jù):

我從Kaggle那里得到了數(shù)據(jù)。數(shù)據(jù)集是開源的,沒有版權(quán)(CC0:公共域)。特別是,我只下載了數(shù)據(jù)集的一部分,其中包含12個城市的圖像,每個城市有10座摩天大樓:

mypath='data/images'
subfolders=[f.pathforfinos.scandir(mypath)iff.is_dir()]
images=[]
images_baw=[]
labels=[]
label=0
size=256
string_labels=[]
forfolderinsubfolders:
onlyfiles=[fforfinlistdir(folder)ifisfile(join(folder,f))]
forfileinonlyfiles:
image_file=Image.open(folder+'/'+file).resize((size,size))
images.append(np.array(image_file))
images_baw.append(np.array(image_file.convert('1')))
labels.append(label)
string_labels.append(folder.split('/')[-1])
label=label+1
labels=np.array(labels)
images=np.array(images)
image_baw=np.array(images_baw)

2.2數(shù)據(jù)可視化

plt.figure(figsize=(20,20))
foriinrange(1,13):
plt.subplot(4,3,i)
identify_label=np.where(labels==i-1)[0]
identify_label=np.random.choice(identify_label)
plt.title('Citylabel=%s'%(string_labels[identify_label]))
plt.imshow(images[identify_label])

2.3定義函數(shù):

以上所有理論都以以下方式實現(xiàn):

defcal_skyline(mask):
h,w=mask.shape
foriinrange(w):
raw=mask[:,i]
after_median=medfilt(raw,19)
try:
first_zero_index=np.where(after_median==0)[0][0]
first_one_index=np.where(after_median==1)[0][0]
iffirst_zero_index>20:
mask[first_one_index:first_zero_index,i]=1
mask[first_zero_index:,i]=0
mask[:first_one_index,i]=0
except:
continue
returnmask


defget_sky_region_gradient(img):

h,w,_=img.shape

img_gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

img_gray=cv2.blur(img_gray,(9,3))
cv2.medianBlur(img_gray,5)
lap=cv2.Laplacian(img_gray,cv2.CV_8U)
gradient_mask=(lap

2.4應(yīng)用算法

這是算法在整個數(shù)據(jù)集上的應(yīng)用:

zero_images=[]
zero_images_plot=[]
forKinrange(len(images)):
zero_image_plot=np.zeros((size,size))
zero_image=zero_image_plot.copy()
foriinrange(size):
zero_image_plot[i,tot_profiles[K][i]-2:tot_profiles[K][i]+2]=1
zero_image[i,tot_profiles[K][i]]=1
zero_images_plot.append(zero_image_plot.T)
zero_images.append(zero_image.T)

示例:

K=0
plt.figure(figsize=(10,10))
plt.suptitle('City=%s'%(string_labels[K]),fontsize=20,y=0.72)
plt.subplot(1,3,1)
plt.title('OriginalImage')
plt.imshow(images[K])
plt.subplot(1,3,3)
plt.title('MaskedImage')
plt.imshow(zero_images_plot[0])
plt.subplot(1,3,2)
plt.title('ProfiledSkyline')
plt.imshow(get_sky_region_gradient(images[K]))

2.5將其轉(zhuǎn)換為信號

為了獲得圖像(1)的正確圖像,我們應(yīng)用以下函數(shù):

defsignal_from_profile(K):
x=np.arange(size)
y=np.array(size-np.array(tot_profiles[K]))
returnx,y

我們可以將其應(yīng)用于數(shù)據(jù)集的所有圖像:

plt.figure(figsize=(13,10))
#plt.suptitle('City=%s'%(string_labels[K]),fontsize=20)
i=0
forqinrange(3):
K=np.random.choice(len(images))
#print(K)
skyline_signal_x,skyline_signal_y=signal_from_profile(K)
plt.subplot(4,4,i+1)
plt.title('OriginalImage')
plt.imshow(images[K])
plt.subplot(4,4,i+3)
plt.title('MaskedImage')
plt.imshow(zero_images_plot[K])
plt.subplot(4,4,i+2)
plt.title('ProfiledSkyline')
plt.imshow(get_sky_region_gradient(images[K]))
plt.subplot(4,4,i+4)
plt.title('ExtractedSignal')
plt.plot(skyline_signal_x,skyline_signal_y)
plt.tight_layout()
i=i+4

3.結(jié)尾

我認(rèn)為這項研究之所以有趣,有多種原因。首先,這很有趣,因為有兩個理論上合理的理由。

它解釋了如何使用拉普拉斯濾波器以非深度學(xué)習(xí)的方式應(yīng)用邊緣檢測

它解釋了如何使用圖像進(jìn)行從頭到腳的實驗,以及如何創(chuàng)建一個有效的圖像處理管道

當(dāng)然,這本身很有趣,因為它為你提供了一個分析不同城市輪廓線的工具!

你可以看到,城市A和城市B有不同的概況,特別是使用提取的信號,我們可以通過以下方式深化這項研究:

提取輪廓線的平均值、中值和標(biāo)準(zhǔn)差

使用深度學(xué)習(xí)對城市輪廓線進(jìn)行分類

對輪廓線與時間進(jìn)行統(tǒng)計研究(輪廓線如何隨時間演變?)

記住,這個項目背后的整個想法是,天空的標(biāo)準(zhǔn)差比摩天大樓的標(biāo)準(zhǔn)差低。

我們還可以使用這種方法作為更復(fù)雜研究的起點(diǎn),并且可以使用編碼器-解碼器來改進(jìn)這些結(jié)果。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 圖像處理
    +關(guān)注

    關(guān)注

    27

    文章

    1292

    瀏覽量

    56743
  • AI
    AI
    +關(guān)注

    關(guān)注

    87

    文章

    30887

    瀏覽量

    269062
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4788

    瀏覽量

    68602
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4797

    瀏覽量

    84682

原文標(biāo)題:使用Python進(jìn)行圖像處理

文章出處:【微信號:vision263com,微信公眾號:新機(jī)器視覺】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    常用的Python圖像處理庫介紹

    本文主要介紹了一些簡單易懂最常用的 Python 圖像處理庫。
    的頭像 發(fā)表于 08-19 10:54 ?2033次閱讀

    Python圖像處理圖像腐蝕與圖像膨脹

    膨脹處理,其中B是一個卷積模板或卷積核,其形狀可以為正方形或圓形,通過模板B與圖像A進(jìn)行卷積計算,掃描圖像中的每一個像素點(diǎn),用模板元素與二值圖像
    發(fā)表于 11-23 16:39

    使用opencv進(jìn)行圖像處理

    使用opencv進(jìn)行圖像處理_于仕琪,感興趣的可以看看。
    發(fā)表于 05-03 14:45 ?0次下載

    python圖像處理opencv步驟是怎么樣的

    越來越覺得python是一強(qiáng)大的工具,處理樣本確實不錯。最近因項目需要涉及到圖片處理,所以開始用python調(diào)用opencv,再次覺得python
    發(fā)表于 12-04 15:29 ?4412次閱讀

    Python基礎(chǔ)-圖像處理工具包

    增強(qiáng),直方圖處理,插值和濾波等 等。雖然在這個軟件包上要實現(xiàn)類似MATLAB中的復(fù)雜的圖像處理算法并不太適合,但是Python的快速開發(fā)能力以及面向?qū)ο蟮鹊戎T多特點(diǎn)使得它非常適 合用來
    發(fā)表于 03-30 14:09 ?17次下載

    Python圖像處理庫Pillow入門教程和代碼資料免費(fèi)下載

    Pillow 是Python 里的圖像處理庫(PIL:Python Image Library),提供了了廣泛的文件格式支持,強(qiáng)大的圖像
    發(fā)表于 01-11 16:20 ?30次下載
    <b class='flag-5'>Python</b><b class='flag-5'>圖像</b><b class='flag-5'>處理</b>庫Pillow入門教程和代碼資料免費(fèi)下載

    Python教程之如何使用使用PIL庫做圖像處理的資料說明

    圖像處理是一門應(yīng)用非常廣的技術(shù),而擁有非常豐富第三方擴(kuò)展庫的 Python 當(dāng)然不會錯過這一門盛宴。PIL (Python Imaging Library)是
    發(fā)表于 01-18 17:01 ?15次下載
    <b class='flag-5'>Python</b>教程之如何使用使用PIL庫做<b class='flag-5'>圖像</b><b class='flag-5'>處理</b>的資料說明

    Python中最常用十大圖像處理庫詳細(xì)介紹

    本文主要介紹了一些簡單易懂最常用的Python圖像處理庫當(dāng)今世界充滿了各種數(shù)據(jù),而圖像是其中高的重要組成部分。然而,若想其有所應(yīng)用,我們需要對這些
    的頭像 發(fā)表于 07-06 11:08 ?2.2w次閱讀

    如何使用Python和Numpy等技術(shù)實現(xiàn)圖像處理

    本文檔的主要內(nèi)容詳細(xì)介紹的是如何使用Python、Numpy、Scipy和matplotlib執(zhí)行圖像處理任務(wù)。
    發(fā)表于 08-28 09:36 ?8次下載
    如何使用<b class='flag-5'>Python</b>和Numpy等技術(shù)實現(xiàn)<b class='flag-5'>圖像</b><b class='flag-5'>處理</b>

    如何使用Python和OpenCV進(jìn)行圖像拼接

      圖像拼接是計算機(jī)視覺中最成功的應(yīng)用之一。如今,很難找到不包含此功能的手機(jī)或圖像處理API。在本文中,我們將討論如何使用Python和OpenCV
    的頭像 發(fā)表于 10-26 15:59 ?1988次閱讀

    分享5個用于圖像處理Python

    圖像處理是操縱圖像以從中提取特征的現(xiàn)象。 在當(dāng)今計算機(jī)視覺和深度學(xué)習(xí)的世界中,大量使用不同的圖像處理算法對
    的頭像 發(fā)表于 02-08 16:23 ?1374次閱讀
    分享5個用于<b class='flag-5'>圖像</b><b class='flag-5'>處理</b>的<b class='flag-5'>Python</b>庫

    十個簡單易懂最常用的 Python 圖像處理

    本文主要介紹了一些簡單易懂最常用的 Python 圖像處理庫。 當(dāng)今世界充滿了各種數(shù)據(jù),而圖像是其中高的重要組成部分。然而,若想其有所應(yīng)用,我們需要對這些
    的頭像 發(fā)表于 02-08 16:59 ?838次閱讀

    關(guān)于python中非常實用的一個圖像處理庫 1

    PIL:Python Imaging Library,是Python環(huán)境下最受歡迎的圖像處理庫,木有之一。然而,在Python2.7之后不再
    的頭像 發(fā)表于 02-08 17:18 ?1343次閱讀

    關(guān)于python中非常實用的一個圖像處理庫 2

    PIL:Python Imaging Library,是Python環(huán)境下最受歡迎的圖像處理庫,木有之一。然而,在Python2.7之后不再
    的頭像 發(fā)表于 02-08 17:18 ?1097次閱讀

    如何使用Python進(jìn)行圖像識別的自動學(xué)習(xí)自動訓(xùn)練?

    如何使用Python進(jìn)行圖像識別的自動學(xué)習(xí)自動訓(xùn)練? 使用Python進(jìn)行圖像識別的自動學(xué)習(xí)和自
    的頭像 發(fā)表于 01-12 16:06 ?591次閱讀