opencv-python数字图像处理学习2:对一张图像进行缩放,观察其分辨率,降低灰度分辨率两种模式,观察图像变化。

一、在开始之前

知识点、方法

本次教程涉及到的知识点:
图像分辨率:
指图像中存储的信息量,是每英寸图像内有多少个像素点,分辨率的单位为PPI(Pixels Per Inch),通常叫做像素每英寸。对于计算机的显示系统来说,一幅图像的PPI值是没有意义的,起作用的是这幅图像所包含的总的像素数, 也就是另一种分辨率表示方法:水平方向的像素数×垂直方向的的像素数。
灰度分辨率:
在数字图像处理教程中,灰度分辨率指的是色阶,
色阶是表示图像亮度强弱的指数标准,也就是我们说的色彩指数。
灰度分辨率指亮度,和颜色无关,但最亮的只有白色,最不亮的只有黑色。
方法
cv2.resize():
其第一个参数为待缩放的图像,
第二个参数为缩放后的图像尺寸大小,如(640,480)
第三个和第四个参数为缩放尺度因子,
第五个参数为缩放的插值方法。
插值方法: 默认时使用的是cv2.INTER_LINEAR缩小时推荐使用cv2.INTER_AREA
扩展放大时推荐使用cv2.INTER_CUBIC 和 cv2.INTER_LINEAR,前者比后者运行速度慢。
码云代码地址:https://gitee.com/steveqobs/opencv
chapter2

二、开始

先引入cv2 和numpy。确定要用的图片

import cv2

img = cv2.imread('img/lena.png')

对一张图像进行缩放,观察其分辨率和图像变化

使用cv2.resize缩放图像

1、第一种缩放方法,使用 shape 获取图片的长和宽
2、缩放-放大:使用cv2.resize,在第二个参数中给定两倍的长和宽
这种方法的缺点是每次要读取原图的长宽
3、print函数打印出图片的分辨率
4、缩放-缩小:在缩小图片的时候,我用了第二种,在第3 、4参数中给定0.5 的比例,长和宽缩小一半

# 第一种缩放方法,用resize(),在第二个参数给定尺寸大小。这里长和宽放大两倍
height, width = img.shape[:2]
# img.shape=(512,512,3) 数组分别代表的是图像的高、宽、通道,上面这句将前两个数值赋给了height和width下面要用到
print("原图分辨率:", height, "*", width)
enlarge = cv2.resize(img, (2 * width, 2 * height))
print("缩放:放大后:", enlarge.shape[:2])

# 上一句默认插值方法参数为cv2.INTER_LINEAR 这句也可以:
# enlarge = cv2.resize(img, (2 * width, 2 * height), interpolation=cv2.INTER_CUBIC)

# 第二种缩放方法,用resize(),在第三、四参数给定缩放比例。这里长和宽缩小到0.5倍。好处是不用读取长宽了
# enlarge = cv2.resize(img, None, fx=1.5, fy=1.5, interpolation=cv2.INTER_CUBIC)
shrink = cv2.resize(img, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_CUBIC)
print("缩放:缩小后:", shrink.shape[:2])

# None是输出图像的尺寸大小,fx和fy是缩放因子
# cv2.INTER_CUBIC 是插值方法,一般默认为cv2.INTER_LINEAR
cv2.imshow('enlarge', enlarge)
cv2.imshow('shrink', shrink)
cv2.imshow('img', img)
cv2.waitKey(0)

观察其分辨率和图像变化

从左到右依次为,缩小、原图、放大

在这里插入图片描述

控制台输出的结果如下:
(显示了图像的长和宽,图像变大了,实际上图像分辨率是降低了的。
假如原图是100ppi,放大后图像分辨率就是50ppi)
在这里插入图片描述

三、降低灰度分辨率,观察图像变化

降低灰度分辨率

# 下面函数先量化到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] = ni
    return img


src = cv2.imread('img/lena.png')

# cv2.COLOR_BGR2GRAY 将BGR格式转换成灰度图片
gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)

# 量化到8级
result8 = reduce_intensity_levels(gray, 7)
# 量化到2级
result2 = reduce_intensity_levels(gray, 1)

cv2.imshow('src', src)
cv2.imshow('gray', gray)
cv2.imshow('result8', result8)
cv2.imshow('result2', result2)
cv2.waitKey(0)

观察图像变化

先将原图转换成灰度级图片了
在这里插入图片描述左边是灰度图片,右边两个 降低灰度分辨率
灰度级数通常是2的整数次幂
中间是8 ,右边是2

在这里插入图片描述

Guess you like

Origin blog.csdn.net/qq_42112618/article/details/120711569