(图像变换)Python-opencv,(批处理笛卡尔坐标系,也就是平时咱们看到的正常图片)二维彩色图像转化为极坐标系下的图像
2021/12/5 20:48:28
本文主要是介绍(图像变换)Python-opencv,(批处理笛卡尔坐标系,也就是平时咱们看到的正常图片)二维彩色图像转化为极坐标系下的图像,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
这个其实代码量不大,但对于我这个啥也编不出来的废柴来说我觉得真的好不容易,历经两天的痛苦折磨,终于完成了!!!
下面进入正题,昨天我找了一天代码,然后挑挑拣拣也就找到一篇还是c++的图像极坐标化处理。
代码如下:
#include <opencv2/opencv.hpp>
#include
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
Mat src = imread("G:/aml/BAS/BAS_0001.tiff", 1); namedWindow("原图", 0); imshow("原图", src); Mat dx, dy; Mat magImg, dst, angle; Sobel(src, dx, CV_32F, 1, 0, 3); Sobel(src, dy, CV_32F, 0, 1, 3); magnitude(dx, dy, magImg); //只求图像的梯度幅值 cv::cartToPolar(dx, dy, magImg, angle, true);///转换成极坐标,同时得到幅值和角度 cv::phase(dx, dy, angle, true);//只求角度 convertScaleAbs(magImg, magImg);//使用线性变换转换输入数组元素成8位无符号整型 cv::normalize(magImg, magImg, 0, 255, NORM_MINMAX);//归一化到0到255范围 namedWindow("幅值图像", 0); cv::imshow("幅值图像", magImg); //根据梯度和梯度方向反求微分图像函数polarToCart //略 //对数极坐标变换 cv::logPolar( src, dst, cv::Point2f( src.cols / 2, src.rows / 2 ), 40, cv::WARP_FILL_OUTLIERS ); namedWindow("对数极坐标", 0); cv::imshow("对数极坐标", dst); waitKey(); return 0;
}
由于没有保存链接,所以找不到原文了,(要是原博主看到或者谁知道链接可以附录在评论上)但这个代码是我一天挑挑拣拣最有理想效果的一篇,运行结果如下:
第一张是原图,第二章是处理之后的图片。
但我还有一个问题就是我是想处理数据集,数据集成百上千张图片,如果一张一张处理未免也太不现实了,所以我就想批处理一下,但是我由于很久没用C++了,对它语法生疏了不好,找了好几个批处理图片文件的想照葫芦画瓢,但都没有成功。
后来我就把这个代码换成了我比较熟悉同时语法也偏简单的Python,Python下批处理就好搞了,但也搞了老半天,还因为缩进问题差点放弃,因为Python由于语法简单,所以他有严格的缩进要求,这里奉劝大家写Python时要注意缩进问题,下面就是我研究了这两天的成果。代码如下
# coding: utf-8 import cv2 import multiprocessing import os def get_img(input_dir): img_paths = [] for (path, dirname, filenames) in os.walk(input_dir): for filename in filenames: img_paths.append(path + '/' + filename) print("img_paths:", img_paths) return img_paths def cartTopolar(img_paths,output_dir): imread_failed = [] try: img = cv2.imread(img_paths) gx = cv2.Sobel(img, cv2.CV_32F, 1, 0, ksize=3) # x方向的导数 gy = cv2.Sobel(img, cv2.CV_32F, 0, 1, ksize=3) # y方向的导数 mag = cv2.magnitude(gx, gy) ang = cv2.phase(gx, gy, 1) """直角坐标系转换为极坐标系""" mag, ang = cv2.cartToPolar(gx, gy, angleInDegrees=1) # 得到梯度幅度和梯度角度阵列 mag = cv2.convertScaleAbs(mag) mag = cv2.normalize(mag, 0, 255, cv2.NORM_MINMAX) cols, rows = mag.shape[:2] dst = cv2.logPolar(img, (cols / 2, rows / 2), 40, cv2.WARP_FILL_OUTLIERS) cv2.imwrite(output_dir + '/' + img_paths.split('/')[-1], dst) # cv2.imshow("absX", absX) # cv2.imshow("absY", absY) #cv2.imshow("Result", dst) cv2.waitKey(0) # cv2.destroyAllWindows() except: imread_failed.append(img_paths) return imread_failed def main(input_dir, output_dir): img_paths = get_img(input_dir) scale = len(img_paths) results = [] pool = multiprocessing.Pool(processes=4) for i, img_path in enumerate(img_paths): a = "#" * int(i / 10) b = "." * (int(scale / 10) - int(i / 10)) c = (i / scale) * 100 results.append(pool.apply_async(cartTopolar, (img_path, output_dir))) print('{:^3.3f}%[{}>>{}]'.format(c, a, b)) # 进度条(可用tqdm) #cv2.imwrite(output_dir + '/' + img_paths.split('/')[-1], dst) pool.close() # 调用join之前,先调用close函数,否则会出错。 pool.join() # join函数等待所有子进程结束 for result in results: print('image read failed!:', result.get()) print("All done.") if __name__ == "__main__": input_dir = "G:/aml/test/" # 读取图片目录表 output_dir = "G:/aml/polar_test3/" # 保存图像目录 main(input_dir, output_dir)
功夫不负有人心,成功了!!!
这篇关于(图像变换)Python-opencv,(批处理笛卡尔坐标系,也就是平时咱们看到的正常图片)二维彩色图像转化为极坐标系下的图像的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-08有遇到过吗?同样的规则 Excel 中 比Python 结果大
- 2024-03-30开始python成长之路
- 2024-03-29python optparse
- 2024-03-29python map 函数
- 2024-03-20invalid format specifier python
- 2024-03-18pool.map python
- 2024-03-18threads in python
- 2024-03-14python Ai 应用开发基础训练,字符串,字典,文件
- 2024-03-13id3 algorithm python
- 2024-03-13sum array elements python