数字图像处理:图像缩放和降低灰度级

news/2024/12/2 7:07:23/

打开、显示、存储图片

用Python版OpenCV实现

image = cv2.imread("images/2_20_a.jpg", cv2.IMREAD_UNCHANGED)
cv2.imwrite("images/full.jpg", image, [int(cv2.IMWRITE_JPEG_QUALITY), 100])
cv2.imshow("image", image)
cv2.waitKey(0)

打开图片后,可以看图片由矩阵构成,shape显示了图片的行高和列宽,打开的是一幅灰度图片,因此只有一个通道
在这里插入图片描述
显示图片:
在这里插入图片描述
保存:
在这里插入图片描述

未经压缩,该图片占444 * 338 * 8bit = 444 * 338 B = 146.5KB
原图在磁盘占20.1KB
保存的图片占53.6KB

图像缩放

最近领域插值

h h h, w w w, h 0 h_0 h0, w 0 w_0 w0 分别为原图高、宽,和目标高、宽
g ( x , y ) g(x, y) g(x,y)为新图像x行y列的灰度等级, f ( x , y ) f(x, y) f(x,y)为原图像
g ( x , y ) = f ( x h h 0 , y w w 0 ) ( 1 ) g(x, y) = f(\frac{xh}{h_0}, \frac{yw}{w_0}) (1) g(x,y)=f(h0xh,w0yw)(1)
或从原图像对应目标图像
g ( x h 0 h , y w 0 w ) = f ( x , y ) ( 2 ) g(\frac{xh_0}{h}, \frac{yw_0}{w}) = f(x, y) (2) g(hxh0,wyw0)=f(x,y)(2)
在(1)式中,假如 h h 0 > 1 \frac{h}{h_0} > 1 h0h>1 缩小图像
在(2)式中,若g(x, y)为原图像,f(x, y)为新图像,则 h 0 h < 1 \frac{h_0}{h} < 1 hh0<1 放大图像
出现小数时,取整。

Python关键代码:

def nearest(img, size):"""Nearest neighbor interpolation:param img: source image:param size: (height, width):return: destination image"""re = np.zeros([size[0], size[1], 1], np.uint8)for x in range(size[0]):for y in range(size[1]):new_x = int(x * (img.shape[0] / size[0]))new_y = int(y * (img.shape[1] / size[1]))re[x, y] = img[new_x, new_y]return re

双线性插值

对于一个目的像素,设置坐标通过反向变换得到的浮点坐标为 ( i + u , j + v ) (i+u,j+v) (i+u,j+v) (其中i、j均为浮点坐标的整数部分,u、v为浮点坐标的小数部分,是取值[0,1)区间的浮点数),则这个像素得值 f ( i + u , j + v ) f(i+u,j+v) f(i+u,j+v) 可由原图像中坐标为 ( i , j ) , ( i + 1 , j ) , ( i , j + 1 ) , ( i + 1 , j + 1 ) (i,j), (i+1,j), (i,j+1), (i+1,j+1) (i,j),(i+1,j),(i,j+1),(i+1,j+1)所对应的周围四个像素的值决定,即:
g ( x , y ) = f ( x h h 0 , y w w 0 ) = f ( i + u , j + v ) = ( 1 − u ) ( 1 − v ) f ( i , j ) + ( 1 − u ) v f ( i , j + 1 ) + u ( 1 − v ) f ( i + 1 , j ) + u v f ( i + 1 , j + 1 ) g(x, y) = f(\frac{xh}{h_0}, \frac{yw}{w_0}) = f(i+u, j+v) = (1-u)(1-v)f(i,j) + (1-u)vf(i,j+1) + u(1-v)f(i+1,j) + uvf(i+1,j+1) g(x,y)=f(h0xh,w0yw)=f(i+u,j+v)=(1u)(1v)f(i,j)+(1u)vf(i,j+1)+u(1v)f(i+1,j)+uvf(i+1,j+1)

出现小数时考虑周围情况,离哪个点进,那个点发挥的作用就更大。

Python关键代码:

def bilinear(img, size):"""Bilinear interpolation:param img: source image:param size: (height, width):return: destination image"""re = np.zeros([size[0], size[1], 1], np.uint8)for x in range(size[0]):for y in range(size[1]):new_x = x * (img.shape[0] / size[0])new_y = y * (img.shape[1] / size[1])i = int(new_x)j = int(new_y)u = new_x - iv = new_y - jif i + 1 >= img.shape[0]:i = img.shape[0] - 2if j + 1 >= img.shape[1]:j = img.shape[1] - 2# f(i+u,j+v)=(1−u)(1−v)f(i,j)+(1−u)vf(i,j+1)+u(1−v)f(i+1,j)+uvf(i+1,j+1) re[x, y] =  (1-u)*(1-v)*img[i, j]+ (1-u)*v*img[i, j+1] +  u*(1-v)*img[i+1, j] +  u*v*img[i+1, j+1]return re

结果:

从左到右
图一:原图
图二:用最近领域插值缩放0.5,再扩大2倍,恢复原图大小
图三:用双线性插值缩放0.5,再扩大2倍,恢复原图大小
图四:OpenCV.resize缩放0.5,再扩大2倍,恢复原图大小
在这里插入图片描述
缩放倍数为0.2,再恢复原大小时
在这里插入图片描述
OpenCV的效过较好,双线性插值其次,最近领域插值效果非常差。

降低灰度分辨率

下面函数先量化到level+1级,再量化至256级以显示

def reduce_intensity_levels(img, level):img = cv2.copyTo(img, None)for x in range(img.shape[0]):for y in range(img.shape[1]):si = img[x, y]ni = int(level * si / 255 + 0.5) * (255 / level)img[x, y] = nireturn img

8灰度级图像
在这里插入图片描述
4灰度级图像
在这里插入图片描述
出现假轮廓

2灰度级图像(2值化 0~127置0 128~256置255)
在这里插入图片描述


http://www.ppmy.cn/news/858716.html

相关文章

(数字图像处理MATLAB+Python)第五章图像增强-第一节:图像增强概述和基于灰度级变换的图像增强

文章目录 一&#xff1a;图像增强概述二&#xff1a;基于灰度级变换的图像增强&#xff08;1&#xff09;线性灰度级变换A&#xff1a;基本线性灰度级变换B&#xff1a;分段线性灰度级变换①&#xff1a;定义②&#xff1a;截取式灰度变换③&#xff1a;窗切片 &#xff08;2&a…

数字图像处理——灰度级分层

灰度级分层的两种基本形式如下&#xff1a; 一&#xff1a;将感兴趣的范围内的灰度值显示为一个值&#xff0c;而其他灰度值显示为另一个值 二&#xff1a;将感兴趣的范围内的灰度值变亮或变暗&#xff0c;而其他灰度值保持不变 Python实现过程如下&#xff1a; 使用的图像…

数字图像处理实验1.1:matlab实现减少图像灰度级

Digital Image Processing 1. Reducing the Number of Gray Levels in an Image 减少图像中的灰度级别的数量 (a)编写一个计算机程序&#xff0c;能够将图像中的灰度数从256减少到2&#xff0c;整数幂为2。所需的灰度级别的数量需要是程序的可变输入。 (b)下载图。2.21(a)&am…

Matlab 读取图像并且显示灰度级 精简 即学即用

程序如下&#xff1a; clc, clear, close all;I imread(ngc6543a.jpg);J rgb2gray(I);figure, imshow(J); clc --- 清除命令窗口命令 clear --- 删除所有之前声明赋值过的变量&#xff0c;并且释放系统内存 close all --- 关闭matlab的弹出来的所有子窗口 imread(path) …

1.求一幅600×800的黑白图像、 16灰度级图像、256灰度级图像,分别需要多少字节的存储空间?

&#xff08;1&#xff09;黑白图像&#xff1a;b600*800480000/8/102458.59KB &#xff08;2&#xff09;16灰度级图像&#xff1a;162^4&#xff0c;即k4&#xff0c;b600*800*41920000b240000B234.37KB &#xff08;3&#xff09;256灰度级图像&#xff1a;2562^8&#xf…

数字图像处理学习笔记(二):图像灰度级的增加、减少

实验截图&#xff1a; 图像灰度级阶梯 实验代码&#xff1a; img1 imread(erciyuan.jpg); img2 rgb2gray(img1); for i0:7 img (uint8(img2/(2^i)))*(2^i); %灰度级逐渐递减的过程 subplot(2,4,i1), imshow(img,[]); title( [ ,num2str(2^(8-i)),级灰度图像]); %设置…

实验2-图像灰度级减少和图像缩放

1 摘要 本实验实现灰度级减少和图像缩放的功能&#xff0c;主要分三个部分&#xff1a;编写一个以2的幂次方将给定图像的灰度级从256减少到2的程序&#xff1b;编写一个基于像素复制方式进行图像缩放的程序&#xff1b;编写一个以双线性插值技术进行图像缩放的程序&#xff0c…

matlab-图形采样及灰度级转换

目录 一、图像采样 1、实验内容 2、采样原理 3、实验程序 4&#xff0e;实验结果与分析 5&#xff0e;思考题 二、图像类型转换 1、实验内容 2&#xff0e;实验原理 3、程序 4&#xff0e;实验结果与分析 5. 思考题 一、图像采样 1、实验内容 试对任意一幅图像分…