영상 처리 응용 편 - 쌀 계수 계속

4073 단어
영상 처리 응용 편 - 쌀 계수 계속
배경 설명:
블 로그 글 을 보 세 요.
사실 찍 은 사진 은 쌀 알갱이 가 서로 접촉 하고 심지어 약간 겹 치 는 사진 이 더 많다.
쌀 의 과립 수 를 정확하게 계산 하 는 것 은 매우 어렵다. 영상 형태학 을 통 해 개폐 작업, 부식 등 손 을 통 해
세그먼트 시도 이후 효과 가 좋 지 않 습 니 다.결국 간단명료 하지만 미세한 오차 가 있 는 계 수 를 발견 하 였 다
방법카메라 사진:
알고리즘 사상:
주로 연결 구역 을 이용 하여 알고리즘 을 발견 하고 모든 연결 구역 을 발견 하 며 이분법 을 사용 하여 절단 이 비교적 작다.
부분의 연결 구역 집합 은 평균 연결 구역 면적 을 구하 고 이 평균 연결 구역 면적 에 따라
단일 쌀 크기 로 접착 부분의 쌀 알 갱 이 를 꺼 내 전체 쌀 을 완성 하 다.
수의 통계:
단점:
평균 연결 구역 면적 의 계산 은 두 가지 요소 에 제약 을 받 는데 하 나 는 최소 연결 구역 집합 에 대한 선택 알고리즘 이다.
두 견본 의 수량.알고리즘 결 과 는 실제 결과 와 일정한 오차 가 있 지만 오 차 는 1% 정도 입 니 다.
프로그램 알고리즘 코드 상세 설명
입력 한 그림 을 흑백 2 값 그림 으로 변환 하고 연결 영역 을 구 하 는 알고리즘 코드 는 다음 과 같 습 니 다.
src = super.filter(src, null);
getRGB(src, 0, 0, width,height, inPixels );
FastConnectedComponentLabelAlgfccAlg = new FastConnectedComponentLabelAlg();
fccAlg.setBgColor(0);
int[] outData = fccAlg.doLabel(inPixels, width, height);
평균 쌀 알갱이 연결 구역 을 가 져 오 는 코드 는 다음 과 같 습 니 다.
Integer[] values =labelMap.values().toArray(new Integer[0]);
Arrays.sort(values);
int minRiceNum = values.length/4;
float sum = 0;
for(int v= offset; voffset; v++) {
sum += values[v].intValue();
}
float minMeans = sum / (float)minRiceNum;
System.out.println(" minMeans = " + minMeans);
프로그램 순서 도 는 다음 과 같 습 니 다.
프로그램 실행 효 과 는 다음 과 같 습 니 다.
실제 쌀 의 과립 수 는 202 이 고, 정 답 률 은 99% 이다.
쌀 수 통 계 를 완성 한 소스 코드 는 다음 과 같다.
public class FindRiceFilter extends BinaryFilter {
	
	private int sumRice;
	private int offset = 10;
	
	public int getSumRice() {
		return this.sumRice;
	}
	
	public void setOffset(int pos) {
		this.offset = pos;
	}

	@Override
	public BufferedImage filter(BufferedImage src, BufferedImage dest) {
		int width = src.getWidth();
        int height = src.getHeight();
        if ( dest == null )
            dest = createCompatibleDestImage( src, null );

        int[] inPixels = new int[width*height];
        int[] outPixels = new int[width*height];
        src = super.filter(src, null);
        getRGB(src, 0, 0, width, height, inPixels );
        FastConnectedComponentLabelAlg fccAlg = new FastConnectedComponentLabelAlg();
		fccAlg.setBgColor(0);
		int[] outData = fccAlg.doLabel(inPixels, width, height);
		
		// labels statistic
		HashMap labelMap = new HashMap();
		for(int d=0; d            
  

좋은 웹페이지 즐겨찾기