天天看點

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()