A. python處理圖像何時要將圖像轉化為uint8格式uint8是什麼用array()方法打開圖像後圖像是什麼格式
1. uint8是無符號八位整型,表示範圍是[0, 255]的整數
2. Python處理圖像個人主要推薦下面兩種
a) PIL (pip install pillow),這個比較原生,並且處理過程中一直是uint8
fromPILimportImage
importnumpyasnp
im=Image.open('test.jpg')#從讀入就是uint8
npim=np.array(im)#轉換成numpyarray處理
b) cv2 (pip install opencv-python),opencv的python實現
importcv2
im=cv2.imread('test.jpg')#讀入默認是uint8格式的numpyarray
一般情況直接用uint8即可,若是有需求(如神經網路等),可以轉換成浮點數等形式。如果需要轉回PIL的圖像對象,那就必須是uint8的格式。如果一直用cv2的話,也可以直接保存浮點數形式的(注意是0~255,不是0~1)。
B. Python怎麼輸出一幅圖像每個點的像素值
我是用PIL這個庫,用opencv的庫也可以x0dx0afrom PIL import Imagex0dx0aimg=Image.open("demo.jpg")x0dx0aimg_array=img.load()x0dx0a然後就可以通過img_array[x,y]來讀取像素值了x0dx0a另外img.size查看圖片大小,也可以通過img_array[x,y]=(11,22,33)來設置RGB像素值
C. 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)
D. Python 有那麼神嗎
很多對Python不熟悉的人,認為Python在最近這些年的興起是運氣而已。本文幫助大家回顧一下過去十幾年Python的3次增長和對應的歷史背景。
Python設計之處的特點,包括易學易用,以及作為膠水語言。易學易用是個難以量化的東西,但至少我接觸的絕大多數朋友都認同Python在學習和使用上是比大部分語言簡單的。有些人不認同Python通常也不是認為Python相對其他語言難學,而是認為Python的運行速度慢,或者動態類型語言的通病。至於膠水語言就比較窄了,面向作為膠水而設計的語言是很少的,印象里只有Lua算得上一個。另一個Python相較其他語言的優勢是字元串處理。
以下介紹Python獲得發展的3次機遇期。
2006年的搜索/NLP:2006年前後正好是搜索引擎公司發展的爆發期。那一年Google中國李開復搞了關門弟子計劃,網路也做了諸多廣告,比如網路更懂中文系列。在那個時代搜索引擎就是IT行業的高科技。之後不久,阿里巴巴也搞了個ASC(阿里巴巴搜索技術研究中心),後來多次追潮流更名,一直作為阿里巴巴內部的前沿研發部門。
而Python用作搜索引擎和NLP是很有歷史的。早期Google在90年代開發搜索引擎爬蟲就是使用Python實現的。而即便是現在,開發爬蟲,Python也基本上就是第一選擇。很多人學習Python的入門程序也是爬蟲。而Python適合開發爬蟲的關鍵在於Python的字元串處理是很方便的。
也就是從2006年末開始,國內的python-cn郵件列表湧入了大量的新人,並以爬蟲為例開始深入學習Python。
2010年的WEB創業潮:2010年開始,國內外出現了新一輪的創業潮,大家開發的是各種各樣的網站。此時的WEB開發上,Python已經逐步成為主流WEB伺服器開發選項中的一種。相對於同時代的Java和PHP等,有著開發效率上的優勢。
正因為早期創業公司需要迅速的迭代和試錯,使得這個時代的Python成為了一個不錯的選項。進而讓更多工程師開始學習起來Python。
也就是從這個時期開始,才逐漸有較多的公司會公開招聘Python工程師。在此前招聘Python工程師的廣告是非常非常少見的。
2014年的Deep Learning:從2014年開始火起來的深度學習上,Python的優勢是近乎絕對的。深度學習的主流開發語言只有C++和Python兩種了,其他語言可以認為根本就沒能在這里分到什麼像樣的空間。所有主流的Deep Learning框架,也是官方直接提供了C++和Python兩種介面。而由於C++開發的難度,當前確實有不少從業工程師是直接用Python搞定深度學習的相關步驟。
這次Python的增長期被更多不了解Python的人認為是Python的狗屎運。但其背後的邏輯反倒是非常堅固的。原因就是Python是個很好的膠水。最初的起點是numpy庫。
numpy是封裝了BLAS的科學計算庫。BLAS是對CPU向量指令集高度優化的數學運算庫。通過BLAS進行科學計算可以得到頂級的計算性能,這個計算性能比未經向量指令集優化的C程序還能快上數倍。而numpy的另一個重要特點就是,把buffer做了封裝,使得buffer的內容是無需Python處理的,而是實際交給特定的軟體庫來處理,numpy只是負責維護該buffer的生命周期,形狀等元數據。這就使得numpy的計算性能不會受到Python的影響,但同時卻可以利用Python的易學易用來管理buffer的生命周期。
numpy對buffer的管理帶來的易用性優勢在後來得到了很大的發展。如以下幾點:
OpenCV:在opencv-python中就是使用了numpy.array來管理圖像數據,卻沒有像C++介面一樣使用Mat。同樣的頂級性能。
PyCuda/PyOpenCL:也是利用了numpy.array來透明傳遞數據給GPU做高性能計算。尤其是集成了JIT,使得可以用字元串的方式傳遞kernel function,不再像C++一樣要獨立編譯一遍。
Caffe/TensorFlow:同樣利用了numpy.array,並利用了PyCuda/PyOpenCL的集成。
所以這樣一路發現下來,由Python是個好膠水,就真的把若干很好用的庫全流程的粘在了一起。在流程集成上都是頂級的性能,而沒有Python的性能損耗,同時帶來了非常好的易用性。
相比其他語言,對這些C/C++庫的玩法都是先封裝一層對象,包準封裝的前後對不上。而且因為大部分語言並不是面向膠水設計,開發C介面都很困難。自然與這些高性能計算庫的結合困難重重。累計起來就與Python產生了差距。
題主所提到的R語言,是一種領域相關的語言,是做統計領域的,類似的還有做科學計算的Matlab。如果程序的輸出只是一份報告,甚至一份統計圖,問題是不大的。但想要成為產品,與其他系統集成則成了難題。一般的伺服器部署產品,是不會選擇在工程上這么不專業的語言。所以,實際應用時,還是要有工程師負責將演算法提取出來,移植到產品級的語言和平台上。舉個例子,R雖然可以正常的訪問MySQL資料庫之類的。但產品級系統中,涉及到memcache、kafka、etcd等,可就沒有R語言的介面了。所以這些領域相關語言,寫一些自己電腦上跑的小程序還可以,進入產品是沒什麼希望了。
再者就是因為通用性一直難以跨越出自己的領域,所以這類語言的生命周期一般都不太長,失去自己領域的強支撐後會很快消亡。所以建議題主還是花一些精力去看看業界通用的一些語言。
E. opencv 圖像識別 c python哪個快
兩者主要的區別在於介面和效率。
實際上Python和C++的OpenCV介面幾乎一樣,不同的是用C++的話,矩陣用的是cv::Mat,Python裡面用的是numpy.array,用法和介面都不一樣,但文檔豐富,使用也非常方便,原理也相似。
效率方面,Python的介面實際上只是一層Binding,最終還是調用libopencv_*.so裡面的函數,所以在OpenCV這一層效率與C++是完全一致的。唯一不同的就是它的numpy.array和cv::Mat。Numpy底層也是使用C Extension的方法寫,但相比C++版的OpenCV介面,Python的介面需要把Numpy的數據轉化成OpenCV的C介面可接受的輸入。
實測Python寫的程序會慢,但具體慢多少並沒有測試數據可支撐。
用Python寫實際上也不會比C++開發快多少,因為介面都是一樣的,我建議不如直接用C++寫。
簡單說兩句,選python還是C++,考慮下面幾個問題
1. 性能壓力在哪裡?python的GIL使得多線程不能多核並行,必須用多進程,而且天生python要比c++慢一些。因此如果是cpu密集型,建議用C++,如果是IO密集型,python沒有那麼大的劣勢。
2. 開發成本高還是運行成本高,一個開發人員一個月多少錢,一個伺服器一個月多少錢,通常來說前者越來越貴而後者反之,權衡下利弊,C++開發要比python慢,在性能都達標的情況下,如果節省的伺服器成本能抵過開發成本,用C++,反之用python。
1,差不多,基本調用參數都一樣,格式符合各自語言規范。
2,在我開發的程序中python比cpp明顯有差距,但是換到工作用的電腦上這個差距就看不錯來了,so,硬體配置好一些,用python做實時也是沒有問題的。外,感覺同樣的函數python就是比cpp慢一些,雖然上面說到python底層用的也是lib。
3,基本一樣。(python可能功能稍微差一點2.4.8版本有個函數沒在python中找到,但是也就那一個)
4,python比較簡單,開發可能快一點(主要是軟體的其他部分可能比較容易開發)。
F. 如何從python中opencv的陣列讀取原始PNG
PNG圖像從我的iPhone到我的MacBook通過TCP。 MacBook的代碼是從怎樣的形象與OpenCV的轉換? PNG格式被選中它們是有效的,但其他格式可以 我寫了一個測試程序,從文件中讀取的rawImage,但不知道如何將它轉化成:# Read rawImage from a file, but in reality will have it from TCPServer
f = open('frame.png', "rb")
rawImage = f.read()
f.close()
# Not sure how to convert rawImage
npImage = np.array(rawImage)
matImage = cv2.imdecode(rawImage, 1)
#show it
cv.NamedWindow('display')
cv.MoveWindow('display', 10, 10)
cv.ShowImage('display', matImage)
cv. WaitKey(0)
1. 另一種方式, 也是在閱讀一個實際的文件的情況下,這將適用於一個unicode路徑(在Windows上進行測試)with open(image_full_path, 'rb') as img_stream:
file_bytes = numpy.asarray(bytearray(img_stream.read()), dtype=numpy.uint8)
img_data_ndarray = cv2.imdecode(file_bytes, cv2.CV_LOAD_IMAGE_UNCHANGED)
img_data_cvmat = cv.fromarray(img_data_ndarray) # convert to old cvmat if needed
2. (你的問題似乎被標記的Objective-C,但你問的Python,所以是你的榜樣,所以我'的。) 我的第一篇文章對堆棧溢出! 簡歷。似乎是你在找什麼。 的LoadImage(iscolor=CV_LOAD_IMAGE_COLOR)→無Loads an image from a file as an IplImage.
Parameters:
filename (str) – Name of file to be loaded.
iscolor (int) –
Specific color type of the loaded image:
CV_LOAD_IMAGE_COLOR the loaded image is forced to be a 3-channel color image
CV_LOAD_IMAGE_GRAYSCALE the loaded image is forced to be grayscale
CV_LOAD_IMAGE_UNCHANGED the loaded image will be loaded as is.
該函數cvLoadImage載入圖像從指定的文件和 返回的指針載入的圖像。目前,下列文件 格式支持:Windows bitmaps - BMP, DIB
JPEG files - JPEG, JPG, JPE
Portable Network Graphics - PNG
Portable image format - PBM, PGM, PPM
Sun rasters - SR, RAS
TIFF files - TIFF, TIF
注意,在當前的alpha通道,如果有的話,是 從輸出圖像除去,例如4通道的RGBA圖像會 載入為RGB。
3. 我想通了:# Read rawImage from a file, but in reality will have it from TCPServer
f = open('frame.png', "rb")
rawImage = f.read()
f.close()
# Convert rawImage to Mat
pilImage = Image.open(StringIO(rawImage));
npImage = np.array(pilImage)
matImage = cv.fromarray(npImage)
#show it
cv.NamedWindow('display')
cv.MoveWindow('display', 10, 10)
cv.ShowImage('display', matImage)
cv. WaitKey(0)
G. 如何用 Python 實現一個摳圖功能
使用Python和OpenCV進行摳圖
其中使用了opencv中的grabcut方法
直接上代碼
[python] view plain
# encoding:utf-8
# 圖像提取
# create by
import numpy as np
import cv2
from matplotlib import pyplot as plt
img = cv2.imread('1.jpg')
mask = np.zeros(img.shape[:2], np.uint8)
bgdModel = np.zeros((1, 65), np.float64)
fgdModel = np.zeros((1, 65), np.float64)
rect = (20, 20, 413, 591)
cv2.grabCut(img, mask, rect, bgdModel, fgdModel, 10, cv2.GC_INIT_WITH_RECT)mask2 = np.where((mask == 2) | (mask == 0), 0, 1).astype('uint8')img = img * mask2[:, :, np.newaxis]
img += 255 * (1 - cv2.cvtColor(mask2, cv2.COLOR_GRAY2BGR))# plt.imshow(img)
# plt.show()
img = np.array(img)
mean = np.mean(img)
img = img - mean
img = img * 0.9 + mean * 0.9
img /= 255
plt.imshow(img)
plt.show()