(图像变换)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,(批处理笛卡尔坐标系,也就是平时咱们看到的正常图片)二维彩色图像转化为极坐标系下的图像的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程