OpenCV,若有奇数行或奇数列,进行频谱裁剪

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV,若有奇数行或奇数列,进行频谱裁剪相关的知识,希望对你有一定的参考价值。

//若有奇数行或奇数列,进行频谱裁剪
magnitudeImage = magnitudeImage(Rect(0, 0, magnitudeImage.cols & -2, magnitudeImage.rows & -2));
magnitudeImage.cols & -2这为什么就把奇数给挑出了

magnitudeImage.cols & -2 是要进行位的和运算。magnitudeImage.cols和-2需要分别转化为无符整型,再转化为二进制数进行和运算。由于-2是负数,再转换的过程中存在溢出等问题,以8位二进制为例子,-2实际转化为二进制的数为11111110。当一个二进制数与11111110进行位的和运算时,该二进制数的最小数位就为0,转化为无符整型时,就是一个偶数。题主的例子就是利用这个原理获取一个不大于magnitudeImage.cols的偶数。 参考技术A 并没有把奇数行和列挑出,而是因为-2的补码为11111110。将其与奇数按位与会实现取到小于magnitudeImage.cols的最大偶数。 参考技术B 所以这个问题解决了么?

opencv图像裁剪与拼接

舍弃不够整除的部分,对大尺寸的图像裁剪成m行n列的小图,将小图相对大图的行列位置存储在图像名中

之后对小图进行目标检测标注目标位置

再将小图依次拼接,铺成大图

 1 # coding=utf-8
 2 from PIL import Image
 3 # pil paste可以进行图片拼接
 4 import cv2
 5 import numpy as np
 6 import glob as glob
 7 import os
 8 """
 9 输入:图片路径(path+filename),裁剪获得小图片的列数、行数(也即宽、高)
10 输出:无
11 """
12 def crop_one_picture(path, filename, cols, rows):
13     img = cv2.imread(filename,1)  ##读取彩色图像,图像的透明度(alpha通道)被忽略,默认参数;灰度图像;读取原始图像,包括alpha通道;可以用1,0,-1来表示
14     sum_rows = img.shape[0]  # 高度
15     sum_cols = img.shape[1]  # 宽度
16     save_path = path + "\crop{0}_{1}\".format(cols, rows)  # 保存的路径
17     if not os.path.exists(save_path):
18         os.makedirs(save_path)
19     print("裁剪所得{0}列图片,{1}行图片.".format(int(sum_cols / cols), int(sum_rows / rows)))
20 
21     for i in range(int(sum_cols / cols)):
22         for j in range(int(sum_rows / rows)):
23             print(save_path+str(os.path.splitext(filename)[0].split("\")[-1]) + _ + str(j) + _ + str(i) + .jpg)
24             cv2.imwrite(
25                 save_path + str(os.path.splitext(filename)[0].split("\")[-1]) + _ + str(j) + _ + str(i) + .jpg, img[j * rows:(j + 1) * rows, i * cols:(i + 1) * cols, :])
26             #cv2.imwrite(‘.//origin-img//{0}_{1}.jpg‘.format(i,j), img[j * rows:(j + 1) * rows, i * cols:(i + 1) * cols])
27     print("裁剪完成,得到{0}张图片.".format(int(sum_cols / cols) * int(sum_rows / rows)))
28     print("文件保存在{0}".format(save_path))
29 
30 
31 """遍历文件夹下某格式图片"""
32 def file_name(root_path,picturetype):
33     filename=[]
34     for root,dirs,files in os.walk(root_path):
35         for file in files:
36             if os.path.splitext(file)[1]==picturetype:
37                 filename.append(os.path.join(root,file))
38     return filename
39 
40 root_path=.\origin-img\
41 filenamelist=file_name(root_path,.jpg)
42 
43 print(filenamelist)
44 each_name_list=[]
45 for each_name in filenamelist:
46     each_name_list.append(each_name.split("\")[-1])
47 print(each_name_list)  # final name
48 w=500
49 h=500
50 for each_img in each_name_list:
51     crop_one_picture(root_path,each_name,w,h)

 

合并图像:

 1 # coding=utf-8
 2 from PIL import Image
 3 # pil paste可以进行图片拼接
 4 import cv2
 5 import numpy as np
 6 import glob as glob
 7 import os
 8 
 9 """
10 
11 输入:图片路径(path+filename),裁剪所的图片的列的数量、行的数量
12 输出:无
13 """
14 def merge_picture(merge_path):
15     filename=file_name(merge_path,".jpg")
16     shape=cv2.imread(filename[0],1).shape    #三通道的影像需把-1改成1
17     cols=shape[1]
18     rows=shape[0]
19     channels=shape[2]
20 
21 
22     max_cols_th = 0
23     max_rows_th = 0
24     for i in range(len(filename)):
25         img=cv2.imread(filename[i],1)
26         cols_th=int(filename[i].split("_")[-1].split(.)[0])
27         if cols_th>max_cols_th:
28             max_cols_th=cols_th
29         rows_th=int(filename[i].split("_")[-2])
30         if rows_th>max_rows_th:
31             max_rows_th=rows_th
32     print(max_rows_th,max_cols_th)
33     num_of_cols=max_cols_th+1
34     num_of_rows=max_rows_th+1
35 
36 
37     dst=np.zeros((rows*num_of_rows,cols*num_of_cols,channels),np.uint8)
38     for i in range(len(filename)):
39         img=cv2.imread(filename[i],1)
40         cols_th=int(filename[i].split("_")[-1].split(.)[0])
41         rows_th=int(filename[i].split("_")[-2])
42         print(rows_th,cols_th)
43         roi=img[0:rows,0:cols,:]
44 
45         dst[rows_th*rows:(rows_th+1)*rows,cols_th*cols:(cols_th+1)*cols,:]=roi
46     cv2.imwrite(merge_path+"merge.jpg",dst)
47 
48 """遍历文件夹下某格式图片"""
49 def file_name(root_path,picturetype):
50     filename=[]
51     for root,dirs,files in os.walk(root_path):
52         for file in files:
53             if os.path.splitext(file)[1]==picturetype:
54                 filename.append(os.path.join(root,file))
55     return filename
56 
57 
58 
59 merge_path=".\origin-img\crop500_500\"   #要合并的小图片所在的文件夹
60 
61 merge_picture(merge_path)

以上是关于OpenCV,若有奇数行或奇数列,进行频谱裁剪的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV 例程200篇232. 特征描述之频谱方法

OpenCV 例程200篇232. 特征描述之频谱方法

python-opencv-图片的裁剪

利用OpenCV对图像进行裁剪

使用 OpenCV 保存 DFT 的频谱

opencv图像裁剪与拼接