from scipy import ndimage from skimage import io from matplotlib import pyplot as plt # img为原始图像 img = io.imread('C:/Users/lvxiong/Desktop/3.jpg') # 中值滤波 n = 3 new_img = ndimage.median_filter(img, (n, n)) # 显示图像 plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False plt.subplot(1, 2, 1) plt.axis('off') plt.imshow(img) plt.title('原图像') plt.subplot(1, 2, 2) plt.axis('off') plt.imshow(new_img) plt.title('中值滤波') plt.savefig('中值滤波结果.tif') plt.show()
时间: 2023-09-12 22:06:37 浏览: 151
这段代码是使用 Python 中的 Scipy 和 Skimage 库实现对图像进行中值滤波的操作,并将滤波后的图像结果进行显示和保存。
具体的实现步骤如下:
1. 导入所需要的库:Scipy 中的 ndimage 模块用于图像处理,Skimage 中的 io 模块用于图像读取,Matplotlib 中的 pyplot 模块用于图像显示和保存。
2. 读取原始图像:使用 io.imread 函数读取指定路径下的图片文件,得到一个表示图像的数组 img。
3. 中值滤波处理:使用 ndimage.median_filter 函数对原始图像进行中值滤波,得到一个新的滤波后的图像数组 new_img。
4. 显示图像结果:使用 pyplot.subplot 函数创建一个包含两个子图的画布,分别用于显示原始图像和滤波后的图像。使用 pyplot.imshow 函数显示图像,并设置标题和标签等属性。最后使用 pyplot.savefig 函数保存滤波后的图像结果,并使用 pyplot.show 函数显示画布。
中值滤波是一种图像处理中常用的滤波方法,它可以有效地去除图像中的噪点,提高图像的质量。
相关问题
pycharm将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))优化一下,能控制压缩率
好的,你可以考虑使用基于DCT的图像压缩算法,通过调整量化表来控制压缩比率和图像质量之间的平衡。具体来说,你可以将DCT系数进行量化,然后设置一个量化参数Q,通过调整Q的大小来控制压缩比率和图像质量之间的平衡。一般来说,Q的值越大,压缩比率就越小,图像质量就越好,反之亦然。
下面是一个简单的基于DCT的图像压缩代码示例,你可以根据需要进行修改和优化:
```python
import numpy as np
import cv2
from scipy.fftpack import dct, idct
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')
def compress_image(im, Q):
# 对图像进行DCT变换
imF = dct2(im)
# 设置量化矩阵
QM = np.array([[16, 11, 10, 16, 24, 40, 51, 61],
[12, 12, 14, 19, 26, 58, 60, 55],
[14, 13, 16, 24, 40, 57, 69, 56],
[14, 17, 22, 29, 51, 87, 80, 62],
[18, 22, 37, 56, 68, 109, 103, 77],
[24, 35, 55, 64, 81, 104, 113, 92],
[49, 64, 78, 87, 103, 121, 120, 101],
[72, 92, 95, 98, 112, 100, 103, 99]])
# 进行量化
imQ = np.round(imF / (QM * Q))
# 对图像进行IDCT变换
im1 = idct2(imQ)
# 限制像素值在0到255之间
im1 = np.clip(im1, 0, 255)
im1 = im1.astype(np.uint8)
return im1
# 读取图像
im = cv2.imread('lena.png', cv2.IMREAD_GRAYSCALE)
# 设置量化参数Q
Q = 50
# 进行图像压缩
im1 = compress_image(im, Q)
# 计算压缩比率
cr = im.size / (im1.size * np.ceil(np.log2(Q)))
# 计算PSNR和SSIM
psnr = peak_signal_noise_ratio(im, im1)
ssim = structural_similarity(im, im1, multichannel=False)
# 输出结果
print('压缩比率: {:.2f}'.format(cr))
print('PSNR: {:.2f}'.format(psnr))
print('SSIM: {:.2f}'.format(ssim))
```
在上面的代码中,你可以调整量化参数Q的大小来控制压缩比率和图像质量之间的平衡。同时,通过计算PSNR和SSIM等指标,可以对压缩后的图像质量进行评估。
优化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%。您可以根据需要调整这个值来控制压缩率和图像质量。
阅读全文