python im.show() cv2.imshow
时间: 2023-06-05 21:47:28 浏览: 136
python中的im.show()和cv2.imshow()是两种不同的图像显示方法。
im.show()是在Python中PIL库中的函数,用于显示PIL图像格式。该函数在图像查看器中打开给定的图像。此方法只能在运行python程序的计算机上打开图像,不能在web页面上直接显示。需要注意的是,在Jupyter Notebook上使用im.show()函数可能无法正常工作。
而cv2.imshow()是opencv库中的函数,可以在Python中使用。该函数用于在窗口中显示图像。这个函数使用系统默认的图像查看器在一个新的窗口中显示给定图像。此函数能够跨平台地显示图像,可在web页面或者其他计算机上直接使用。
综上所述,两者都是图像显示方法,但im.show()只能显示PIL图像格式,在python程序所在的计算机上显示;而cv2.imshow()可显示各种图像格式,在不同平台上直接使用,具有更好的通用性和跨平台性。
相关问题
for i in range(points1.shape[0]): # 第一幅图 im1 = cv.circle(im1, (points1[i][0].astype(int),points1[i][1].astype(int)), 10,get_color(points4D[i,2]), -1) # 第二幅图 tmp_point = np.dot(R,points4D[i,:].reshape(3,1)) + t tmp_point = tmp_point.reshape(-1) im2 = cv.circle(im2, (points2[i][0].astype(int),points2[i][1].astype(int)), 10,get_color(tmp_point[2]), -1) plt.subplot(121) plt.imshow(im1[:,:,::-1]) plt.subplot(122) plt.imshow(im2[:,:,::-1]) plt.show()这段代码有什么问题,请帮我修改一下
这段代码中,缺少对变量 `R` 和 `t` 的定义和初始化,而这两个变量是计算 `tmp_point` 的必要参数。因此,需要先定义和初始化这两个变量。
假设已经定义了 `R` 和 `t`,那么可以修改代码如下:
```python
# 定义和初始化 R 和 t
R = ...
t = ...
for i in range(points1.shape[0]):
# 第一幅图
im1 = cv.circle(im1, (points1[i][0].astype(int),points1[i][1].astype(int)), 10,get_color(points4D[i,2]), -1)
# 第二幅图
tmp_point = np.dot(R,points4D[i,:].reshape(3,1)) + t
tmp_point = tmp_point.reshape(-1)
im2 = cv.circle(im2, (points2[i][0].astype(int),points2[i][1].astype(int)), 10,get_color(tmp_point[2]), -1)
# 显示图像
plt.subplot(121)
plt.imshow(im1[:,:,::-1])
plt.subplot(122)
plt.imshow(im2[:,:,::-1])
plt.show()
```
另外,因为这段代码中用到了 `cv` 和 `plt` 两个模块,需要先导入这两个模块,例如:
```python
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
```
优化import scipy.fftpack as fp from skimage.io import imread from skimage.color import rgb2gray, gray2rgb import matplotlib.pyplot as plt from skimage.draw import rectangle_perimeter import numpy as np import cv2 import numpy as np import matplotlib.pylab as plt from mpl_toolkits.mplot3d import Axes3D # noqa: F401 unused import from mpl_toolkits.axes_grid1 import make_axes_locatable from skimage.metrics import peak_signal_noise_ratio, structural_similarity from sklearn.metrics import mean_squared_error, mean_absolute_error from matplotlib.ticker import LinearLocator, FormatStrFormatter from scipy.fftpack import dct, idct import cv2 as cv def dct2(a): return dct(dct(a, axis=0, norm='ortho'), axis=1, norm='ortho') def idct2(a): return idct(idct(a, axis=0, norm='ortho'), axis=1, norm='ortho') im = rgb2gray(imread('2.jpg')) imF = dct2(im) im1 = idct2(imF) print(np.allclose(im, im1)) plt.figure(figsize=(10,5)) plt.gray() # 绘制第一个子图 plt.subplot(121), plt.imshow(im), plt.axis('off'), plt.title('original image', size=10) # 显示第一个子图 plt.show() # 绘制第二个子图 plt.subplot(122), plt.imshow(im1), plt.axis('off'), plt.title('reconstructed image (DCT+IDCT)', size=10) ,使能控制压缩率
为了控制压缩率,您可以使用DCT系数的阈值来减少它们的数量。具体来说,您可以将DCT系数的绝对值与一个阈值进行比较,并将小于该阈值的系数设置为零。这个阈值越高,压缩率就越高,但是图像质量也会受到影响。您可以使用以下代码来实现这一点:
```python
# 设置阈值
threshold = 0.1
# 对DCT系数进行阈值处理
imF_thresh = imF * (np.abs(imF) > (threshold*np.max(imF)))
# 对处理后的DCT系数进行IDCT反变换
im2 = idct2(imF_thresh)
# 显示处理前后的图像
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(10, 5))
ax = axes.ravel()
ax[0].imshow(im, cmap=plt.cm.gray)
ax[0].set_title('Original image')
ax[1].imshow(im2, cmap=plt.cm.gray)
ax[1].set_title('Compressed image (DCT+IDCT)')
for a in ax:
a.axis('off')
plt.show()
```
在这个例子中,我们将阈值设置为0.1,即只保留最大DCT系数的10%。您可以根据需要调整这个值来控制压缩率和图像质量。
阅读全文