赞
踩
说明:统计像素值,用柱形图来统计
cv.calcHist(images,channels,mask,histSize,ranges)
#直方图
img=cv.imread("E:\\Pec\\cat.jpg",0)
hist=cv.calcHist([img],[0],None,[256],[0,256])
print(hist.shape)
plt.hist(img.ravel(),256)
plt.show()
#彩色图
img=cv.imread("E:\\Pec\\cat.jpg")
color=('b','g','r')
for i,col in enumerate(color):
histr=cv.calcHist([img],[i],None,[256],[0,256])
plt.plot(histr,color=col)
plt.xlim([0,256])
plt.show()
掩码(mask):只有两部分,一部分为黑,另一部分为白。
img=cv.imread("E:\\Pec\\cat.jpg",0) mask_1=np.zeros(img.shape[:2],np.uint8) print(mask_1.shape) #选择一些区域 mask_1[100:300,180:480]=255 #[100:300]表示上下去100位置到300,同理左右去180位置到480 cv_show('mask',mask_1) masked_img=cv.bitwise_and(img,img,mask=mask_1)#与操作,mask表示要提取的区域 cv_show('masked_img',masked_img) plt.subplot(221),plt.imshow(img,'gray') plt.subplot(222),plt.imshow(masked_img,'gray') plt.show() #plt.subplot(221) 表示将整个图像窗口分为2行2列, 当前位置为1. #plt.subplot(221) 表示第一行的左图 #plt.subplot(222) 表示将整个图像窗口分为2行2列, 当前位置为2. #plt.subplot(222) 第一行的右图 #plt.plot(图线名) #plt.xlim() 显示的是x轴的作图范围 #plt.ylim() 显示的是y轴的作图范围
shape[:2] 取彩色图片的长和宽
shape[:3]取彩色图片的长和宽和通道
img.shape[0]:图像的垂直高度
img.shape[1]:图像的水平宽度
img.shape[2]:图像的通道数
矩阵中,[0]代表水平,[1]代表高度。
print(type(img)) #显示类型 print(img.shape) #显示尺寸 print(img.shape[0]) #图片宽度 print(img.shape[1]) #图片高度 print(img.shape[2]) #图片通道数 print(img.size) #显示总像素个数 print(img.max()) #最大像素值 print(img.min()) #最小像素值 print(img.mean()) #像素平均值 print(img.shape[:0]) print(img.shape[:1])#图片宽度 print(img.shape[:2])#图片宽度,高度 print(img.shape[:3])#图片宽度,高度,通道数
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
说明:图像的基本运算有很多种,比如两幅图像可以相加、相减、相乘、相除、位运算、平方根、对数、绝对值等;图像也可以放大、缩小、旋转,还可以截取其中的一部分作为ROI(感兴趣区域)进行操作,各个颜色通道还可以分别提取及对各个颜色通道进行各种运算操作。
#bitwise_and、bitwise_or、bitwise_xor、bitwise_not这四个按位操作函数。
void bitwise_and(InputArray src1, InputArray src2,OutputArray dst, InputArray mask=noArray()); //dst = src1 & src2
void bitwise_or(InputArray src1, InputArray src2,OutputArray dst, InputArray mask=noArray()); //dst = src1 | src2
void bitwise_xor(InputArray src1, InputArray src2,OutputArray dst, InputArray mask=noArray()); //dst = src1 ^ src2
void bitwise_not(InputArray src, OutputArray dst,InputArray mask=noArray()); //dst = ~src
img=cv.imread("E:\\Pec\\cat.jpg",0)
hist=cv.calcHist([img],[0],None,[256],[0,256])
#均衡化
equ=cv.equalizeHist(img)
plt.subplot(221),plt.hist(img.ravel(),256)
plt.subplot(222),plt.hist(equ.ravel(),256)
plt.show()
res=np.hstack((img,equ))
cv_show("red",res)
说明:生活在时间的世界中,早上7:00吃早饭,8:00上班路上,9:00上班,以时间为参照的时域分析。频域中看来一切都是静止的,以上帝的视角。不需要了解你什么时间按照顺序干了什么事,只需要了解你这一天干了什么就行了
注意:
(1)输入图像需要先转换成np.float32格式
(2)得到的结果中频域为0的部分会在左上角,通常要转到中心位置,可以通过shift变换来实现
(3)cv.dft()返回的结果是双通道的(实部,虚部),通常需要转换成图像格式才能展示(0,255)
补充:
(1)numpy.zeros(shape, dtype=float)
shape
:创建的新数组的形状(维度)。dtype
:创建新数组的数据类型。(2)numpy.ones(shape, dtype=None, order=‘C’)
img=cv.imread("E:\\Pec\\lida.jpg",0)
img_float32=np.float32(img)#输入图像需要先转换成np.float32格式
#傅里叶转换为复数
dft=cv.dft(img_float32,flags=cv.DFT_COMPLEX_OUTPUT)
#将低频从左上角转换到中心
dft_shift=np.fft.fftshift(dft)
#得到灰度图能表示的形式
#cv.dft()返回的结果是双通道的(实部,虚部),通常需要转换成图像格式才能展示(0,255)
magnitude_spectrum=20*np.log(cv.magnitude(dft_shift[:,:,0],dft_shift[:,:,1]))
plt.subplot(121),plt.imshow(img,'gray')
plt.title('Input Image'),plt.xticks([]),plt.yticks([])
plt.subplot(122),plt.imshow(magnitude_spectrum,'gray')
plt.title('Magnitude Spectrum'),plt.xticks([]),plt.yticks([])
plt.show()
#低通滤波器 img=cv.imread("E:\\Pec\\lida.jpg",0) img_float32=np.float32(img)#输入图像需要先转换成np.float32格式 #傅里叶转换为复数 dft=cv.dft(img_float32,flags=cv.DFT_COMPLEX_OUTPUT) #将低频从左上角转换到中心 dft_shift=np.fft.fftshift(dft) #找到图像中心位置 rows,cols=img.shape crow,col=int(rows/2),int(cols/2) #低通滤波 #生成rows行cols列的2纬矩阵,数据格式为uint8,uint8的范围[0,255] mask=np.zeros((rows,cols,2),np.uint8) mask[crow-30:crow+30,col-30:col+30]=1 #IDFT fshift=dft_shift*mask f_ishift=np.fft.ifftshift(fshift) img_back=cv.idft(f_ishift) img_back=cv.magnitude(img_back[:,:,0],img_back[:,:,1]) plt.subplot(121),plt.imshow(img,'gray') plt.title('Input Image'),plt.xticks([]),plt.yticks([]) plt.subplot(122),plt.imshow(img_back,'gray') plt.title('Result'),plt.xticks([]),plt.yticks([]) plt.show()
从结果可以看出,图像的边缘模糊,但是图像除边缘部分的其他地方不模糊
#高通滤波
#生成rows行cols列的2纬矩阵,数据格式为uint8,uint8的范围[0,255]
mask=np.ones((rows,cols,2),np.uint8)
mask[crow-30:crow+30,col-30:col+30]=0
从结果可以看出,图像只有边缘信息保存下来,内容模糊不见了
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。