这个其实代码量不大,但对于我这个啥也编不出来的废柴来说我觉得真的好不容易,历经两天的痛苦折磨,终于完成了!!!
下面进入正题,昨天我找了一天代码,然后挑挑拣拣也就找到一篇还是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)
功夫不负有人心,成功了!!!