DIP实验2

1、图像的线性点运算

用不同的系数对图像的各像素点进行线性运算,并在两行三列中显示出来

2、图像的非线性点运算:幂运算

γ值以1为分界线,当值大于1时可以产生和对数运算相同的结果,即将灰度值低的区域进行扩展,灰度值高的区域进行压缩,提高图像亮度。当γ值小于1时,将得到相反的结果,即灰度值高的区域进行扩展,将灰度值低的区域进行压缩,减小图像亮度。当c=γ=1是,将是简单的线性变换,输入与输出相等。

3、代数运算:加法运算

遇到的问题:(1)没有定义高斯函数,导致报错;

                      (2)将图像的标签title设置为中文时会有莫名其妙的报错,而且显示的图像标签是方框

要点:(1)img=np.array(img)将读取的图像转换为numpy数组 ,img.flags.writeable=True将读取到的图像数组变成可编辑的,这两句可有可无cv2读取到的图像本就是可编辑的数组

           (2)img=img/255将img进行归一化,将图像像素值归一化到[0,1]区间

           (3)高斯函数的定义:生成与图像形状相同的高斯噪声 noise = np.random.normal(mean, std, image.shape) ;将噪声添加到图像上 noisy_image = image + noise;限制像素值在[0, 1]范围内 noisy_image = np.clip(noisy_image, 0, 1)

           +

(4)k=np.zeros([img.shape[0],img.shape[1]])#初始化一个与图像大小相同的全零数组k

4、代数运算:减法运算

使用高斯函数为图像加上噪声后再减去原图像,实现对噪声的提取

遇到的问题:将读取图像的拓展名打错,导致报错5、

 5、代数运算:乘法

使用cv2中的multiioly‘函数实现图像像素点的乘法运算

拓展:也可以使用np库乘以1.2并限制值范围 img1 = np.clip(1.2 * img, 0, 255).astype(np.uint8)   img2 = np.clip(2 * img, 0, 255).astype(np.uint8)

疑点及解决:multiply函数会采用截断的方式自动处理越界问题

6、代数运算:除法

使用cv2.divide(被除数,除数)实现

要点:plt.imshow(img, 'gray', vmin=0, vmax=255)#plt.imshow(img, 'gray', vmin=0, vmax=255) # vmin:指定图像显示时的最小值。所有小于 vmin 的像素值在显示时会被映射为黑色(或最低亮度值)。 # vmax:指定图像显示时的最大值。所有大于 vmax 的像素值在显示时会被映射为白色(或最高亮度值)。

7、逻辑运算

定义了A、B两个数组并对其进行按位与、按位或以及按位取反操作

要点:(1)A = np.zeros([256, 256])#使用 NumPy 库创建一个256×256二维数组,并将所有元素初始化为 0,"数组的形状:" A.shape"数组的数据类型:"A.dtype

(2)A[80:150, 80:120] = 1#使用 NumPy 进行数组切片和赋值的操作,  修改了数组 A 中从第 80 行到第 149 行(包括 80 行,不包括 150 行),以及从第 80 列到第 119 列(包括 80 列,不包括 120 列)的元素值

(3)C = cv2.bitwise_and(A, B)#用于执行按位与(bitwise AND)操作的函数。它对两个输入数组(通常是图像)的每个对应元素执行按位与操作。

(4)D = cv2.bitwise_or(A, B)#用于执行按位或(bitwise OR)操作的函数。它对两个输入数组(通常是图像)的每个对应元素执行按位或操作。

8、图像直方图的显示

要点:(1)imshow如果不加参数'gray',matplot库会给图像自动附上彩色;想要显示灰度图,imread读取和imshow显示的时候都要进行灰度处理

(2)hist=cv2.calcHist([img],[0],None,[256],[0,255]) # [img] #:输入图像。这里是一个列表,传入的是单个图像 img。如果要计算多通道图像的直方图,也可以传入多张图像的列表。 # [0] :指定要计算直方图的通道。对于灰度图像,通道索引为 0。对于彩色图像(如 BGR 格式),通道索引分别为 0(蓝色通道)、1(绿色通道)和 2(红色通道)。 # None : 掩膜(mask)。如果设置为 None,则计算整个图像的直方图。如果提供了一个掩膜图像,那么只计算掩膜中非零像素对应的区域的直方图。 # [256] #:直方图的大小(bins)。这里设置为 256,表示将像素强度值范围 [0, 255] 分成 256 个区间(bins)。每个 bin 表示一个像素强度范围内的像素数量。 # [0, 255] :像素强度范围。对于灰度图像,像素强度范围通常是 [0, 255]。如果需要计算其他范围的直方图,可以调整这个参数 #返回的直方图是一个二维数组,形状为 (256, 1)。每个元素表示对应像素强度的像素数量。

(3)plt.plot(hist)#根据 hist 数组中的数据绘制一条曲线,其中横轴表示像素强度值(灰度值),纵轴表示每个强度值对应的像素数量

(4)plt.hist(img.ravel(),256,[0,256]) # img.ravel() :img.ravel() 将图像 img 转换为一个一维数组。对于灰度图像,img 本身就是一个二维数组,ravel() 方法将其展平为一维数组,方便后续处理。如果 img 是彩色图像(BGR 格式),img.ravel() 会将所有通道的像素值混合在一起,因此在这种情况下需要分别处理每个通道。 # 256 # 这是直方图的 bins 数量,表示将像素强度值范围 [0, 255] 分成 256 个区间。每个 bin 表示一个像素强度范围内的像素数量。 # [0, 256] :这是像素强度值的范围。对于灰度图像,像素强度值范围通常是 [0, 255]。这里设置为 [0, 256] 是为了确保包含所有可能的像素值。

疑点与解决:v2.calcHist 是 OpenCV 提供的专门用于计算图像直方图的函数,计算结果是一个二维数组,可以直接用于进一步的图像处理或分析。 # plt.hist 是 Matplotlib 提供的通用直方图绘制函数,可以直接绘制直方图,但不返回直方图数据。

9、直方图增强:直方图均衡化

使用 cv2.calcHist 分别计算变亮图像 img_h 和变暗图像 img_l 的直方图,再使用cv2.equalizeHist(img_h)对图像进行直方图均衡化,绘制出均衡化之前及均衡化之后的图像和直方图

10、图像变换:离散傅里叶变换

要点:(1)# cv2.dft 是 OpenCV 提供的离散傅里叶变换函数。 # img / 255:将图像像素值归一化到 [0, 1] 范围,因为 DFT 对输入值的范围敏感。 # cv2.DFT_COMPLEX_OUTPUT:指定输出为复数形式,结果是一个三维数组,其中每个像素有两个通道,分别表示实部和虚部。

(2)#np.fft.fftshift 用于将频谱的零频分量(DC 分量)移动到频谱的中心。

(3)#cv2.idft 是 OpenCV 提供的逆离散傅里叶变换函数。逆变换将频域信号转换回时域(空间域)信号。

(4)img_cen = cv2.magnitude(img_cen[:, :, 0], img_cen[:, :, 1]) # cv2.magnitude 用于计算复数的幅度(模)。 # img_dft[:, :, 0] 和 img_dft[:, :, 1] 分别表示复数的实部和虚部。

11、图像离散余弦变换

遇到的问题:h, w = img.shape if h % 2 != 0: img = img[:-1, :] if w % 2 != 0: img = img[:, :-1]#没有这一段会报错,h, w = img.shape,h, w = img.shape,cv2.dct 函数要求输入图像的宽度和高度必须是偶数 # cv2.dct 是 OpenCV 提供的离散余弦变换函数。 # img / 255:将图像像素值归一化到 [0, 1] 范围,因为 DCT 对输入值的范围敏感。 # cv2.dct 的结果是一个二维数组,表示图像的频谱。

要点:(1)img_s=cv2.idct(img_dft) # cv2.idct 是 OpenCV 提供的逆离散余弦变换函数。 # 逆变换将频域信号转换回时域(空间域)信号。

(2)cv2.dct 是 OpenCV 提供的离散余弦变换函数。

(3)abs 函数用于取频谱的绝对值。这是因为频谱中的值可能是复数,而 plt.imshow 无法直接处理复数数据。 # abs(img_dft) 返回一个与 img_dft 形状相同的数组,其中每个值是对应频谱值的绝对值。

(4)# np.log 函数用于对频谱取自然对数。这是因为频谱的动态范围通常非常大,直接显示可能会导致大部分信息丢失。 # 取对数可以将频谱值压缩到一个更小的范围内,使低频分量更容易观察。 # 乘以 20 是为了将对数值转换为分贝(dB)单位,这在信号处理中是一种常见的做法,可以更好地表示幅度的变化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值