日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

pythontype(1+0xf*3.14)_numpy强制类型转换|图像线性增强|不同数据类型与图像的显示...

發(fā)布時(shí)間:2025/3/19 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 pythontype(1+0xf*3.14)_numpy强制类型转换|图像线性增强|不同数据类型与图像的显示... 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

創(chuàng)建矩陣

a=np.ones((3,3),dtype=np.uint8)

b=np.arange(9).reshape((3,3))

c=np.array([[50,55,60],[65,70,75],[80,85,90]])

如果在創(chuàng)建的時(shí)候沒有指定數(shù)據(jù)類型,那么默認(rèn)是int32

強(qiáng)制類型轉(zhuǎn)換

方法一:

b.dtype=np.uint8

雖然dtype變了,但是shape也變了,再看看里面的數(shù)據(jù)

除了原先的數(shù)據(jù),又添加了新的數(shù)據(jù)0

方法二:astype

對(duì)c這個(gè)對(duì)象做astype這個(gè)操作

c.astype(np.uint8)

Out[11]:

array([[50, 55, 60],

[65, 70, 75],

[80, 85, 90]], dtype=uint8)

這樣就是期望的結(jié)果了。

不同數(shù)據(jù)類型之間的運(yùn)算

1.int32+uint8=int32

f=c+d

2.uint8+float32=float32

g=d+e

cv2和plt顯示矩陣的數(shù)據(jù)類型

d=c.astype(np.uint8)

plt.imshow(c,'gray')

Out[13]:

plt.imshow(d,'gray')

Out[14]:

plt顯示uint8和int32的效果是一樣的,都可以顯示

cv2.namedWindow('1', cv2.WINDOW_NORMAL);

cv2.imshow('1',c);

cv2.imshow('1',d);

cv2.imshow()也可以顯示uint8和int32類型的矩陣,由于矩陣過小,cv的窗口很小,就不截圖了。

浮點(diǎn)型

1.簡(jiǎn)單例子

e=np.arange(9).reshape((3,3)).astype(np.float32)

plt.imshow(e,'gray')

Out[20]:

cv2.imshow('1',e)

cv2.imshow和plt都可以顯示

2.但是如果是三通道的圖片,像素是float型,那么plt無法顯示

例如

lina=cv2.imread('lina2.png')

n1=0.5;

lina1=lina*n1

plt.imshow(lina1)

Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).

Out[9]:

plt.imshow(lina1.astype(np.float32),'gray')

Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).

但是,plt可以顯示單通道的float型

img=cv2.imread('lina2.png',0)

n1=0.5;n2=2

img1=img*n1

plt.imshow(img1,'gray')

lina=cv2.imread('lina2.png',0)

n1=0.5;n2=2

lina1=lina*n1

plt.subplot(121);plt.title('uint8')

plt.imshow(lina1.astype(np.uint8),'gray')

plt.subplot(122);plt.title('float64')

plt.imshow(lina1,'gray')

plt.show()

cv2

cv2.imshow('1',img1)

cv2.imshow('1',img1.astype(np.float32))

對(duì)于float32,float64。cv2顯示都是一片空白

但是:

cv2.imshow('1',img1.astype(np.uint8))

可見:

cv2的顯示只能顯示uint8

數(shù)據(jù)溢出

數(shù)據(jù)類型:https://www.runoob.com/numpy/numpy-dtype.html

d矩陣是有c矩陣int32強(qiáng)制類型轉(zhuǎn)化成的,數(shù)據(jù)類型是uint8,說明范圍是0~255

通過賦值,觀察console臺(tái)中的數(shù)據(jù)變化發(fā)現(xiàn)

超過255的,從0開始,循環(huán)始終是從0到255

輸入255對(duì)應(yīng)255,輸入256對(duì)應(yīng)0,輸入257對(duì)應(yīng)1,輸入365對(duì)應(yīng)365-256=109,輸入900對(duì)應(yīng)900-256*2=132

輸入-256對(duì)應(yīng)0,-255對(duì)應(yīng)1,-257對(duì)應(yīng)255

如果從int32轉(zhuǎn)換成uint8,是不是如上的數(shù)值結(jié)果呢?

c[0,:]=[256,365,900];c[1,:]=[-256,-255,-257]

d=c.astype(np.uint8)

結(jié)果與上述分析相同

總結(jié):

在規(guī)定的數(shù)據(jù)類型下有一個(gè)數(shù)據(jù)范圍,超過數(shù)據(jù)范圍的數(shù)則從這個(gè)范圍的最小開始重新計(jì)數(shù)

圖像線性增強(qiáng)

1.對(duì)像素直接加上或減去一個(gè)數(shù)值

import cv2

import numpy as np

import matplotlib.pylab as plt

plt.rcParams['font.sans-serif']=['SimHei']

plt.rcParams['axes.unicode_minus'] = False

lina = cv2.imread('lina2.png',0)

rows,cols = lina.shape

a=np.ones((rows,cols),dtype=lina.dtype)

plt.subplot(321)

plt.imshow(a*20+lina,'gray');plt.title('+20')

plt.subplot(322)

plt.imshow(a*50+lina,'gray');plt.title('+50')

plt.subplot(323)

plt.imshow(lina-a*20,'gray');plt.title('-20')

plt.subplot(324)

plt.imshow(lina-a*50,'gray');plt.title('-50')

plt.subplot(325)

plt.imshow(lina,'gray');plt.title('source')

plt.show()

加減20是在正常的范圍內(nèi),因?yàn)樵瓐D像素的最大是37,最小是17

而加減50就會(huì)出現(xiàn)原來是白,變成黑,原來是黑又變成白的情況,因?yàn)樵瓐DLina是uint8格式,新構(gòu)建的矩陣a也是uint8,所以結(jié)果也是uint8類型的。

0到255從黑到白,然后又一輪從黑到白

import cv2

import numpy as np

import matplotlib.pylab as plt

plt.rcParams['font.sans-serif']=['SimHei']

plt.rcParams['axes.unicode_minus'] = False

# #直接對(duì)像素加上一個(gè)實(shí)數(shù)來對(duì)圖像的亮度進(jìn)行一個(gè)整體的提升

lina = cv2.imread('lina2.png',0)

rows,cols = lina.shape

構(gòu)造數(shù)據(jù)類型是float64的常數(shù)矩陣

a=np.ones((rows,cols))

默認(rèn)類型是float64

然后吧和這個(gè)float64+uint8

b=a*50+lina

plt.imshow(b,'gray')

用plt去顯示一個(gè)float6的4矩陣

得到:

構(gòu)造數(shù)據(jù)類型是uint8的常數(shù)矩陣

aa=np.ones((rows,cols),dtype=lina.dtype);

bb=aa*50+lina

plt.imshow(bb,'gray')

所以說,如果想避免以上的情況的話

一開始的常數(shù)矩陣就構(gòu)造float型,最后用plt顯示float型矩陣

但是…發(fā)現(xiàn)這么搞之后,跟原圖沒啥大的區(qū)別了

lina = cv2.imread('lina2.png',0)

rows,cols = lina.shape

#a=np.ones((rows,cols),dtype=lina.dtype)

a=np.ones((rows,cols))

plt.subplot(321)

plt.imshow(a*20+lina,'gray');plt.title('+20')

plt.subplot(322)

plt.imshow(a*5000+lina,'gray');plt.title('+5000')

plt.subplot(323)

plt.imshow(lina-a*20,'gray');plt.title('-20')

plt.subplot(324)

plt.imshow(lina-a*5000,'gray');plt.title('-5000')

plt.subplot(325)

plt.imshow(lina,'gray');plt.title('source')

plt.show()

3.直接對(duì)像素乘以一個(gè)系數(shù)n來對(duì)圖像的對(duì)比度進(jìn)行增加或減小,

其中n=2,n=0.5,注意灰度值超出255的區(qū)域還是以255來顯示。

import cv2

import numpy as np

import matplotlib.pylab as plt

plt.rcParams['font.sans-serif']=['SimHei']

plt.rcParams['axes.unicode_minus'] = False

##線性增強(qiáng)

#直接對(duì)像素乘以一個(gè)系數(shù)n來對(duì)圖像的對(duì)比度進(jìn)行增加或減小,其中n=2,n=0.5,注意灰度值超出255的區(qū)域還是以255來顯示。

lina=cv2.imread('lina2.png',0)

n1=0.5;n2=2

lina1=lina*n1

plt.subplot(121);plt.title('*0.5')

plt.imshow(lina1,'gray')

#這一步先轉(zhuǎn)成int32,再乘以2,這樣的話超過255的值會(huì)正常顯示

lina2=lina.astype(np.int32)*n2

lina2[lina2>255]=255 #超過255的設(shè)為255

plt.subplot(122);plt.title('*2')

plt.imshow(lina2,'gray')

plt.show()

總結(jié)

以上是生活随笔為你收集整理的pythontype(1+0xf*3.14)_numpy强制类型转换|图像线性增强|不同数据类型与图像的显示...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。