2019-04-19 15:52:38 qxqxqzzz 阅读数 169

【原理】numpy的ndarray是可以先横向堆叠,再纵向堆叠的。最后显示出整体图像。

【效果】横向堆叠再纵向堆叠

# cv imshow多行多列堆叠

import os
import cv2
import numpy as np

show_pic_size = (200, 200) #堆叠后每一个小图片的大小,根据需要调整

img_dir = 'D:\Projects\xxx\\test_examples' # 注意该文件夹下的图片命名不能有中文
imgs_list = os.listdir(img_dir)
n = len(imgs_list)
dims = int(n**0.5) # 原始图像个数最好为一个平方数,否则可能会显示不全。最终显示dims列图片。

img_all = []

all = np.zeros(shape=(200, 200*dims, 3)) # 每行dims列,图像是3维的,最后一个参数为3
all = all.astype(np.uint8) # imshow只显示uint8类型数值

list1 = [] # 存放纵向堆叠列表

# 堆叠效果:每行dims列,总共dims行
for i in range(n):
    img_i = cv2.imread(img_dir + '\\' + str(imgs_list[i])) # 读取一张图片
    img_i = cv2.resize(img_i, show_pic_size) # 调整分辨率大小
    cv2.putText(img_i, 'img_i', (1,30),cv2.FONT_HERSHEY_SIMPLEX,0.6,(0,0,255),2) # 每次在图片上添加相应的文字,格式为:照片/添加的文字/左上角坐标/字体/字体大小/颜色/字体粗细
    img_all.append(img_i)
    if i % dims == dims - 1: # 每dims个横向堆叠一次
        rows = np.hstack(img_all)
        list1.append(all)
        list1.append(rows)
        all = np.vstack(list1) # 每dims个纵向堆叠一次
        img_all = [] # 横向堆叠清空
        list1 = [] # 纵向堆叠列表清空

all = all[200:, :] # 删去前200行的全0(显示为黑色)
cv2.imshow('Result', all) # 不要中文命名,否则会乱码报错。
cv2.waitKey(0)

【效果】(图片如涉及版权请联系我删除)

【其他】

1,更多put_text字体:https://www.jianshu.com/p/e99ede5103ed

2,imshow窗体标题中文乱码解决办法:使用PIL(pillow):https://stackoverflow.com/questions/50854235/how-to-draw-chinese-text-on-the-image-using-cv2-puttextcorrectly-pythonopen

 

【致谢】感谢以上链接作者及:

https://blog.csdn.net/GAN_player/article/details/78155283

https://blog.csdn.net/jacke121/article/details/87723912#commentBox

https://blog.csdn.net/ITBigGod/article/details/87009082

2014-12-29 18:56:56 sunbin0123 阅读数 1015
今天发现了一些比较好的机器视觉,图像处理,多物体追踪的资源,分享出来。


Top1 当然所有论文、代码和数据集的列表
http://www.cvpapers.com/index.html

Top2 CVChina的代码下载列表
http://www.cvchina.net/catalog.asp?cate=7

Top3 Zdenek Kalal的TLD算法
http://cvchina.net/post/44.html
主页:http://info.ee.surrey.ac.uk/Personal/Z.Kalal/tld.html
有开元的程序,数据和各种代码实现
https://github.com/zk00006/OpenTLD

Top4 Discrete-Continuous Energy Minimization for Multi-Target Tracking
http://research.milanton.de/dctracking/
https://bitbucket.org/amilan/dctracking

Top5 几个同业者的博客
http://blog.csdn.net/pp5576155
http://blog.csdn.net/yang_xian521
http://blog.csdn.net/chenbang110

论文,代码,数据都有


Top6 写综述

视频中的交通标志检测与识别研究
http://blog.csdn.net/pp5576155/article/details/6962694


Top7 Multiple Objects Tracking Tutorial

https://www.youtube.com/embed/Z9X3IhHytrQ

2015-01-17 20:36:26 u010278305 阅读数 6865

本笔记说明如何对叠加物体的数量进行计数,并对其进行分割。

本文算法思路参考了Nash的思路,图像也是采用Nash的图像,为叠加硬币,链接:http://opencv-code.com/tutorials/count-and-segment-overlapping-objects-with-watershed-and-distance-transform/

本文涉及到的主要知识点如下:

1、距离变换。

2、基于分水岭变换的分割。

其中,本文采用基于标记符控制的分水岭分割,源该算法的思路来自冈萨雷斯的数字图像处理(MATLAB版)(第二版)。

算法过程如下:

1、对原始图像进行二值化。

2、对二值化后的图像进行距离变换,并归一化到0~1。

3、对距离变换以0.5为阈值进行二值化,之后获得连通分量的数量即为硬币的数量。

4、用sobel算子求梯度的幅度(因为梯度幅度图像沿物体边缘有较大模值,故理想情况下,对梯度图像进行分水岭变换可得到沿物体边缘的分水岭脊线)。

5、用最小覆盖技术处理图像,使得局部最小区域仅出现在标记过的位置(不然会导致过分割,使脊线出现在不该出现的位置)。

6、进行分水岭变换。

本文对应的matlab源代码如下:

%function:
%       用距离变换获得叠加硬币的数量,并用分水岭变换对叠加的硬币进行分割
%referrence:
%       http://opencv-code.com/tutorials/count-and-segment-overlapping-objects-with-watershed-and-distance-transform/
%       冈萨雷斯,数字图像处理(MATLAB版)(第二版)
%date:2015-1-17
%author:chenyanan
%转载请注明出处:http://blog.csdn.net/u010278305

%清空变量,读取图像
clear;close all
src = imread('images/watershed-disttrans-src-img.jpg');

figure('name','Process'),
%显示原始图像
subplot(2,2,1),imshow(src),title('src'),

%转换为灰度图像
gray=rgb2gray(src);
gray = im2double(gray);
subplot(2,2,2),imshow(gray),title('gray'),

%用ostu方法获取二值化阈值,进行二值化并进行显示
level=graythresh(gray);
bw=~im2bw(gray,level);
subplot(2,2,3),imshow(bw),title('bw'),

%Get the distance transform and normalize the result to [0,1] so we can visualize and threshold it,
dist = bwdist(bw);
maxDist=max(max(dist));
dist=dist./maxDist;
dist=im2bw(dist,0.5);

%获取边界,得到连通边界的数量
[B,Lbound] = bwboundaries(dist,'noholes');
ncomp = length(B);

titlenum=sprintf('coins:%d',ncomp);
subplot(2,2,4),imshow(dist),title(titlenum),

%Create the marker image for the watershed algorithm.
markers=dist;
%We also need to draw the background marker. 
%Assuming that the objects located at the center of the image, 
%we simply draw a marker near the border.
markers(2:8,2:8)=1;

%用sobel算子来求梯度模值
%梯度幅值在物体边缘有较大值,通过对梯度模值进行分水岭变换,
%理想情况下,可得到沿物体边缘的分水岭脊线
h=fspecial('sobel');
g=sqrt(imfilter(gray,h,'replicate').^2+...
       imfilter(gray,h','replicate').^2);

%由于存在大量的局部最小值,直接应用watershed会导致过度分割,故先用最小覆盖技术处理图像,
%使得局部最小区域仅出现在标记过的位置
g2 = imimposemin(g,markers);

%Perform the watershed algorithm.
L=watershed(g2);

%将分水岭的像素值改为255
f2=gray;
f2(L==0)=255;

%绘制识别结果
figure('name','Result');
subplot(1,2,1),imshow(f2),title('watershed pixels'),

%用不同颜色来标记每个前景物体和背景
dst = label2rgb(L);
subplot(1,2,2),imshow(dst);title('watershed region'),

运行结果如下:



源图像如下:



2018-05-10 22:16:25 M_Z_G_Y 阅读数 1141

该方法是最简单得物体跟踪方法,即利用掩膜和位运算的方法来追踪特定颜色的物体.

核心方法:

def object_tacking(frame):
    hsv = cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)
    # 设置颜色阈值
    lower = np.array([110, 50, 50])
    upper = np.array([130, 255, 255])
    # 掩膜
    mask=cv2.inRange(hsv,lower,upper)
    # 位运算
    res=cv2.bitwise_and(frame,frame,mask=mask)

    cv2.imshow('frame', frame)
    cv2.imshow('mask', mask)
    cv2.imshow('res', res)
    if cv2.waitKey(5)&0xFF==27:
        cv2.destroyAllWindows()

 

2018-10-15 17:14:08 Daisy_D99 阅读数 1970

python 将文件夹内所有2D图像堆叠为3D图像并保存

导入必要的库:

from skimage import io

创建一个空的3维数组:

np.zeros(shape=(3,4,5), dtype='float64')

用2维数组对3维数组的每一维赋值:

im3d[i]=im2d

代码如下:

# -*- coding: utf-8 -*-
"""
Created on Sat Sep 22 09:58:22 2018


@author: sy
"""
import numpy as np
import os
from skimage import io


filepath='D:\\DATA'
files=os.listdir(filepath)
count=0
im3d=np.zeros(shape=(len(files),io.imread(os.path.join(filepath,files[0])).shape[0],
              io.imread(os.path.join(filepath,files[0])).shape[1]),
             dtype='uint16')


count=0
for file_ in files:
    im2d=io.imread(os.path.join(filepath,file_))
    im3d[count]=im2d
    count+=1


print(im3d.shape)
print(im3d.dtype)


io.imsave('D:\\3D\\1.tif',im3d)
没有更多推荐了,返回首页