天天看点

matlab/python+opencv提取圆形鱼眼图片的有效区域

1、原图:

matlab/python+opencv提取圆形鱼眼图片的有效区域

2、有效区域:

matlab/python+opencv提取圆形鱼眼图片的有效区域

3、matlab代码:

close all;clear;clc
%读取原图片
img=imread('fisheye.jpg');
%设置灰度阈值
T=40;

%转为灰度图片
img_gray=rgb2gray(img);
%提取原图大小
[m,n,k]=size(img_gray);

%从上向下扫描
for i=1:m
    flag=0;
    for j=1:n
        if(img_gray(i,j)>=T)
           if(img_gray(i+1,j)>=T)
               top=i;
               flag=1;
               break;
           end
        end
    end
    if flag==1
       break;
    end
end

%从下向上扫描
for i=m:-1:1
    flag=0;
    for j=1:n
        if(img_gray(i,j)>=T)
           if(img_gray(i-1,j)>=T)
               bottom=i;
               flag=1;
               break;
           end
        end
    end
    if flag==1
       break;
    end
end

%从左向右扫描
for j=1:n
    flag=0;    
    for i=top:bottom
        if(img_gray(i,j)>=T)
           if(img_gray(i,j+1)>=T)
               left=j;
               flag=1;               
               break;
           end
        end
    end
    if flag==1
       break;
    end
end

%从右向左扫描
for j=n:-1:1
    flag=0;    
    for i=top:bottom
        if(img_gray(i,j)>=T)
           if(img_gray(i,j-1)>=T)
               right=j;
               flag=1;               
               break;
           end
        end
    end
    if flag==1
       break;
    end
end

%计算鱼眼图像有效区域半径
R=max((right-left)/2,(bottom-top)/2);
%生成有效区域内新的鱼眼图像
img_valid=imcrop(img,[left,top,2*R,2*R]);
%保存有效区域图片
imwrite(img_valid,'img_valid.jpg');
%显示图片
figure(1);imshow(img);
figure(2);imshow(img_valid);
           

4、python+opencv代码:

# -*- coding: utf-8 -*-
from __future__ import division
import cv2

#读取鱼眼图片
img = cv2.imread("fisheye.jpg")
#设置灰度阈值
T = 40

#转换为灰度图片
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#提取原图大小
rows,cols = img.shape[:2]
print rows,cols

#从上向下扫描
for i in range(0,rows,1):
    for j in range(0,cols,1):
        if img_gray[i,j] >= T:
            if img_gray[i + 1,j] >= T:
                top = i
                break
    else:
        continue
    break
print 'top =',top

#从下向上扫描
for i in range(rows-1,-1,-1):
    for j in range(0,cols,1):
        if img_gray[i,j] >= T:
            if img_gray[i - 1,j] >= T:
                bottom = i
                break
    else:
        continue
    break
print 'bottom =',bottom

#从左向右扫描
for j in range(0,cols,1):
    for i in range(top,bottom,1):
        if img_gray[i,j] >= T:
            if img_gray[i,j + 1] >= T:
                left = j
                break
    else:
        continue
    break
print 'left =',left

#从右向左扫描
for j in range(cols-1,-1,-1):
    for i in range(top,bottom,1):
        if img_gray[i,j] >= T:
            if img_gray[i,j - 1] >= T:
                right = j
                break
    else:
        continue
    break
print 'right =',right

#计算有效区域半径
R = max((bottom - top) / 2,(right - left) / 2)
print 'R =',R

#提取有效区域
img_valid = img[top:top + 2 * R,left:left + 2 * R]
cv2.imwrite('fisheye_valid.jpg',img_valid)

#显示图片
cv2.imshow('fisheye',img)
cv2.imshow("fisheye_valid",img_valid)
cv2.waitKey(0)
cv2.destroyAllWindows()