第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

常規(guī)與使用 For 循環(huán)時(shí)的 Numpy 數(shù)組乘法差異

常規(guī)與使用 For 循環(huán)時(shí)的 Numpy 數(shù)組乘法差異

慕蓋茨4494581 2023-02-22 16:30:55
我想在一個(gè)完全黃色的圖像上應(yīng)用乘法混合。圖片是: 巴黎埃菲爾鐵塔黃色圖像是使用以下方法創(chuàng)建的:img_paris = img1 = cv2.imread("/content/drive/My Drive/Datasets/Images/paris.jpg")yellow_image = np.ones(img_paris.shape) * 255 yellow_image[:,:,0] *= 0我嘗試了兩種技術(shù):首先我使用了正則乘法imgc = img_paris.copy()imgc = (imgc * yellow_image)這導(dǎo)致: 埃菲爾成倍增加然后我使用 for 循環(huán)來(lái)乘以單個(gè)元素for x in range(yellow_image.shape[0]):  for y in range(yellow_image.shape[1]):    imgc[x,y] = (imgc[x,y] * yellow_image[x,y])結(jié)果是 Eiffel Multiplied 2第二個(gè)結(jié)果看起來(lái)圖像以某種方式倒置了。這兩種技術(shù)應(yīng)該會(huì)產(chǎn)生相似的結(jié)果。為什么圖像在 for 循環(huán)技術(shù)中會(huì)倒轉(zhuǎn)?我想使用 For 循環(huán)進(jìn)行更多控制。有人能告訴我為什么會(huì)這樣嗎?為什么這兩種技術(shù)會(huì)導(dǎo)致不同的結(jié)果?
查看完整描述

3 回答

?
阿晨1998

TA貢獻(xiàn)2037條經(jīng)驗(yàn) 獲得超6個(gè)贊

圖像不同,因?yàn)榍耙粋€(gè)圖像包含浮點(diǎn)數(shù)據(jù),而后一個(gè)圖像的數(shù)據(jù)類(lèi)型是uint8.

imgc = (imgc * yellow_image)由于 的數(shù)據(jù)類(lèi)型是浮點(diǎn)數(shù),該指令生成一個(gè)帶有浮點(diǎn)數(shù)數(shù)據(jù)的新數(shù)組yellow_image

創(chuàng)建一個(gè)yellow_imagewith 數(shù)據(jù)類(lèi)型uint8來(lái)解決問(wèn)題:

yellow_image = np.ones(img_paris.shape, dtype=np.uint8) * 255 
yellow_image[:,:,0] *= 0
imgc *= yellow_image

或者使用numpy.ndarray.astyp創(chuàng)建數(shù)組的副本并轉(zhuǎn)換為uint8

imgc = (imgc * yellow_image)

imgc = (imgc * yellow_image).astype(np.uint8)

或使用numpy.multiply, 通過(guò)指定轉(zhuǎn)換規(guī)則和類(lèi)型:

imgc = np.multiply(imgc, yellow_image, casting='unsafe', dtype=np.uint8)


查看完整回答
反對(duì) 回復(fù) 2023-02-22
?
嚕嚕噠

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超7個(gè)贊

這兩種技術(shù)應(yīng)該會(huì)產(chǎn)生相似的結(jié)果。為什么圖像在 for 循環(huán)技術(shù)中會(huì)倒轉(zhuǎn)?


因?yàn)槟銘?yīng)該這樣做,轉(zhuǎn)換數(shù)據(jù)類(lèi)型:


imgc = np.uint64(img_paris.copy()) # <-- convert datatype


for x in range(yellow_image.shape[0]):

    for y in range(yellow_image.shape[1]):

        imgc[x,y] = (imgc[x,y] * yellow_image[x,y])

解釋部分 1 (dtype)

這是因?yàn)閐type在重新分配完整矩陣時(shí)會(huì)發(fā)生變化,而在重新分配切片時(shí)不會(huì)發(fā)生:


a = np.array([[1]], np.uint8)

b = np.array([[1]], np.float64)


a[0] = a[0] * b[0] # assigning slices dtype of a does not change

print(a.dtype) #=> uint8


a = a * b # while assigning the full matrix it does

print(a.dtype) #=> float64

如果您dtype一路打印,您會(huì)看到:


yellow_image_1 = np.ones(img_paris.shape) * 255

print(yellow_image_1.dtype) #=> float64

yellow_image_1[:,:,0] *= 0

print(yellow_image_1.dtype) #=> float64


imgc_1 = img_paris.copy()

print(imgc_1.dtype) #=> uint8

imgc_1 = (imgc_1 * yellow_image_1)

print(imgc_1.dtype) #=> float64

和這個(gè):


yellow_image_2 = np.ones(img_paris.shape) * 255

print(yellow_image_2.dtype)  #=> float64

yellow_image_2[:,:,0] *= 0

print(yellow_image_2.dtype) #=> float64


imgc_2 = img_paris.copy()

print(imgc_2.dtype) #=> uint8

for x in range(yellow_image_2.shape[0]):

    for y in range(yellow_image_2.shape[1]):

        imgc_2[x,y] = (imgc_2[x,y] * yellow_image_2[x,y])

print(imgc_2.dtype) #=> uint8

所以你最終會(huì)得到不同的dtype矩陣。


解釋部分 2 (OpenCV BGR)

如前所述,請(qǐng)記住 OpenCv 使用BGR 格式并且每個(gè)像素值從到0,255說(shuō)np.uint8。


因此,如果您使用的是 matplotlib,為了顯示圖像,您必須交換 B 和 R 通道:


img_paris = cv2.imread('3ClnT.jpg')

plt.imshow(img_paris[:,:,::-1])

如果您使用cv2.imwrite()或cv2imshow()保存,則不需要這樣做,例如:


cv2.imwrite('paris.jpg', img_paris)

也就是說(shuō),您可以使用這個(gè)線(xiàn)性命令生成純黃色圖像:


yellow_image = np.ones_like(img_paris) * (0, 255, 255)

并顯示或保存它:


plt.imshow(yellow_image[:,:,::-1])

cv2.imwrite('solid_yellow.jpg', yellow_image)

現(xiàn)在,乘法結(jié)果的paris_yellow = img_paris * yellow_image值大于255:


[0..1]使用 RGB 數(shù)據(jù)(對(duì)于浮點(diǎn)數(shù)或[0..255]整數(shù))將輸入數(shù)據(jù)剪切到 imshow 的有效范圍。


所以,當(dāng)你相乘時(shí),你最終得到的最大像素值可以是255 * 255 = 65025.


然后你需要:


將乘法項(xiàng)轉(zhuǎn)換為支持整數(shù)的數(shù)據(jù)類(lèi)型65025

乘法后,歸一化然后轉(zhuǎn)換回uint8

這是一個(gè)例子:


paris_yellow_2 = np.int64(img_paris) * np.int64(yellow_image) # <- use int64 terms

max_px_val = np.amax(paris_yellow_2) # <-- Max pixel alue

paris_yellow_2 = np.uint8((paris_yellow_2/max_px_val) * 255) # <- normalize and convert back to uint8

plt.imshow(paris_yellow_2[:,:,::-1])

這是結(jié)果:

http://img1.sycdn.imooc.com//63f5d3060001104f04690352.jpg

給出不同結(jié)果的其他選項(xiàng)G是將和通道相乘以獲得大于crop 值的R系數(shù)。在這種情況下,您需要使用 float :1>255dtype


paris_yellow_3 = np.float64(img_paris) * (1, 3, 3)

paris_yellow_3[paris_yellow_3 > 255] = 255 # <- crops to 255 pixels values > 255

paris_yellow_3 = paris_yellow_3.astype(np.uint8) # <- back to uint8

在這種情況下B,乘以1(不變),G并R乘以3,得到以下結(jié)果:

http://img1.sycdn.imooc.com//63f5d3100001260f04710351.jpg

查看完整回答
反對(duì) 回復(fù) 2023-02-22
?
烙印99

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超13個(gè)贊

問(wèn)題出現(xiàn)在一個(gè)完全出乎意料的地方:在創(chuàng)建yellow_image. np.ones默認(rèn)情況下創(chuàng)建一個(gè)浮點(diǎn)類(lèi)型的數(shù)組:因此yellow_image是用浮點(diǎn)類(lèi)型元素創(chuàng)建的。查看:


>>> yellow_image.dtype

dtype('float64')

因此,當(dāng)您執(zhí)行以下操作時(shí):imgc * yellow_image,生成的數(shù)組數(shù)據(jù)類(lèi)型將提升為精度更高的數(shù)據(jù)類(lèi)型(當(dāng)然是浮點(diǎn)類(lèi)型),因此imgc具有如下元素:


array([[[    0., 24225., 12750.],

        [    0., 23715., 12240.],

        [    0., 23460., 11985.],

        ...,

是浮點(diǎn)型的。


為避免此問(wèn)題,并且不經(jīng)歷顯式編寫(xiě)數(shù)據(jù)類(lèi)型的麻煩,請(qǐng)使用:


yellow_image = np.ones_like(img_paris) * 255

np.ones_like創(chuàng)建一個(gè)數(shù)組,其中包含傳遞給它的數(shù)組的形狀,以及完全相同的 dtype - 消除您的后顧之憂(yōu)?,F(xiàn)在檢查:


>>> yellow_image.dtype

dtype('uint8')

現(xiàn)在考慮imgc1 = imgc * yellow_image和imgc2是循環(huán)的輸出。查看:


>>> np.allclose(imgc1, imgc2)

True

問(wèn)題解決了。


注意- 回答關(guān)于為什么圖像倒置的問(wèn)題:


當(dāng)乘法結(jié)果為浮點(diǎn)類(lèi)型時(shí),它會(huì)將大數(shù)字(24225、12750 等)作為像素顏色值。當(dāng)您使用此數(shù)組寫(xiě)入圖像時(shí),所有這些數(shù)字都被裁剪為最大可能的像素顏色值:255。因此,您看到的大部分圖像都是黃色的,因?yàn)樗小耙绯觥敝刀急徊眉魹?255,導(dǎo)致最亮的黃色陰影。


另一方面,當(dāng)乘法完成強(qiáng)制uint8類(lèi)型時(shí),任何大于 255 的值都會(huì)“回滾”到無(wú)符號(hào) 8 位整數(shù)的最小可能值:0。因此,如果值為 487,dtype 限制將強(qiáng)迫它成為0 + (287 - 255) - 1 = 31。這是溢出。所以很大的數(shù)字最終會(huì)變得很小——數(shù)學(xué)很簡(jiǎn)單,查一下。因此,您會(huì)得到一種倒置的圖像(意外的暗像素)。


查看完整回答
反對(duì) 回復(fù) 2023-02-22
  • 3 回答
  • 0 關(guān)注
  • 113 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)