python进行图像处理rows, cols = Img.shape,copyMakeBorder()、merge()、dft()、log()和normalize()

这篇博客是学习OpenCV的笔记,重点介绍了如何使用Python实现图像处理的几个关键函数,包括:copyMakeBorder用于添加图像边框,merge用于通道合并,dft进行离散傅里叶变换,log计算数组元素的自然对数,以及normalize进行图像数据的归一化操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这是学习opencv官网上例子的笔记跳转官网示例(用python实现)关于函数的用法,例如:copyMakeBorder(),merge()、dft()、getoptimeditsize()、log()和normalize()。
在这里插入图片描述
1.解释rows, cols = Img.shape
这行代码的意思是把图片像素的行数,列数返回给rows,cols
2。getOptimalDFTSize函数
m = cv.getOptimalDFTSize( rows ) n = cv.getOptimalDFTSize( cols )
getOptimalDFTSize()函数返回给定向量尺寸的傅里叶最优尺寸大小,这里返回的时rows和cols
3.copyMakeBorder()函数
cv.copyMakeBorder(InputArray src, OutputArray dst, int top, int bottom,int left, int right, int borderType, const Scalar& value=Scalar() )
InputArray src:输入图像
OutputArray dst:输出的图像,与输入图像相同类型
int top, int bottom, int left, int right:在原来边界的基础上每个方向添加的像素个数,就是改变边框的粗细
int borderType:表示边界的类型
const Scalar& value=Scalar():表示如果上一个边界的类型值是 BORDE

// 扩展图像到最佳DFT尺寸 int optimalRows = getOptimalDFTSize(img.rows); int optimalCols = getOptimalDFTSize(img.cols); Mat padded; copyMakeBorder(img, padded, 0, optimalRows - img.rows, 0, optimalCols - img.cols, BORDER_CONSTANT, Scalar::all(0)); // 准备DFT输入(两个通道:实部虚部) Mat planes[] = {Mat_<float>(padded), Mat::zeros(padded.size(), CV_32F)}; Mat complexImg; merge(planes, 2, complexImg); // 执行傅里叶变换 dft(complexImg, complexImg); // 将低频移到频谱中心 int cx = complexImg.cols / 2; int cy = complexImg.rows / 2; Mat q0(complexImg, Rect(0, 0, cx, cy)); // 左上象限 Mat q1(complexImg, Rect(cx, 0, cx, cy)); // 右上象限 Mat q2(complexImg, Rect(0, cy, cx, cy)); // 左下象限 Mat q3(complexImg, Rect(cx, cy, cx, cy)); // 右下象限 // 交换象限(左上与右下交换) Mat tmp; q0.copyTo(tmp); q3.copyTo(q0); tmp.copyTo(q3); // 交换象限(右上与左下交换) q1.copyTo(tmp); q2.copyTo(q1); tmp.copyTo(q2); // 创建高斯低通滤波器 Mat mask = Mat::zeros(complexImg.size(), CV_32F); float D0 = 60; // 截止频率(控制滤波强度) for (int i = 0; i < mask.rows; i++) { for (int j = 0; j < mask.cols; j++) { float d = sqrt(pow(i - cy, 2) + pow(j - cx, 2)); mask.at<float>(i, j) = exp(-(d * d) / (2 * D0 * D0)); } } // 应用频域滤波器 split(complexImg, planes); multiply(planes[0], mask, planes[0]); multiply(planes[1], mask, planes[1]); merge(planes, 2, complexImg); // 逆交换象限(恢复原始排列) Mat q0_new = complexImg(Rect(0, 0, cx, cy)); Mat q3_new = complexImg(Rect(cx, cy, cx, cy)); q0.copyTo(tmp); q3_new.copyTo(q0_new); tmp.copyTo(q3_new); Mat q1_new = complexImg(Rect(cx, 0, cx, cy)); Mat q2_new = complexImg(Rect(0, cy, cx, cy)); q1.copyTo(tmp); q2_new.copyTo(q1_new); tmp.copyTo(q2_new); // 逆傅里叶变换 idft(complexImg, complexImg, DFT_SCALE | DFT_REAL_OUTPUT); // 裁剪归一化处理结果,,,对于不知道傅里叶原理细节的人,如何理解这段代码并一步
03-25
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值