가우스 블러
가우시안 스무딩이라고도하는 가우스 블러는 Adobe Photoshop, Gimp 및 Paint.net과 같은 이미지 처리 소프트웨어에 널리 사용되는 처리 효과입니다. 일반적으로 이미지 노이즈를 줄이고 디테일 레벨을 줄이는 데 사용됩니다. 이 블러 기술에 의해 생성 된 이미지의 시각적 효과는 반투명 화면을 통해 이미지를 관찰하는 것과 같습니다.이 화면은 렌즈 외부 이미징 효과 Bokeh 및 일반 조명 그림자와 크게 다릅니다. 가우스 스무딩은 컴퓨터 비전 알고리즘의 사전 처리 단계에서도 다른 스케일에서 이미지의 이미지 효과를 향상시킵니다. 수학적 관점에서 볼 때, 이미지의 가우스 흐림 과정은 정규 분포와의 컨볼 루션입니다. 정규 분포를 가우시안 분포라고도하기 때문에이 기술은 가우스 퍼지 (Gaussian Fuzzy)라고합니다. 이미지와 원형 정사각형 블러의 컨볼 루션은보다 정확한 초점 영상 효과를 생성합니다. 가우스 함수의 푸리에 변환은 또 다른 가우스 기능이기 때문에 가우스 블러는 이미지의 저역 통과 필터입니다.
가우스 퍼지는 가우스의 정상 분포 밀도 함수를 사용하여 이미지에서 각 픽셀의 변환을 계산합니다.
1 차원 가우시안 기능을 기반으로, 2 차원 가우스 기능을 도출 할 수있다 :
여기서 r은 퍼지 반경, r^2 = x^2 + y^2이고 σ는 정규 분포의 표준 편차입니다. 2 차원 공간에서,이 공식에 의해 생성 된 표면의 윤곽선은 중심에서 정상적으로 분포되는 동심원입니다. 0이 아닌 분포가있는 픽셀로 구성된 Convolution 행렬은 원래 이미지로 변환됩니다. 각 픽셀의 값은 주변 픽셀의 값의 가중 평균입니다. 원래 픽셀의 값은 가우시안 분포 값이 가장 큰 것이므로 무게가 가장 큽니다. 인접한 픽셀이 원래 픽셀에서 멀어지고 멀어지면 무게가 점점 작고 작아집니다. 이 퍼징 프로세스는 다른 이퀄라이제이션 퍼지 필터보다 에지 효과를 더 많이 보존합니다.
실제로 iOS에서 가우시안 블러를 구현하는 것은 쉽습니다. iOS 5.0이 초기에 핵심 이미지 API가 있었고 CoreImage.framework 라이브러리에는 많은 수의 필터 구현이 제공됩니다.
+(uiimage *) Coreblurimage : (uiimage *) withblurnumber : (cgfloat) blur {cicontext *context = [cicontext contextwithOptions : nil]; ciimage *inputimage = [ciimage imagewithcgimage : image.cgimage]; // 필터 설정 cifilter *filter = [cifilter filterwithName :@"cigaussianBlur"]; [필터 setValue : inputImage forkey : kciinputimagekey]; [필터 setValue : @(blur) forkey : @"inputradius"]; // Blurimage ciimage *result = [필터 valueforkey : kcioutputimagekey]; cgimageref outimage = [context createcgimage : 결과에서 결과 : [결과 범위]]; uiimage *blurimage = [uiimage imagewithcgimage : Outimage]; cgimagerElease (Outimage); 회복 흐림;}또한 Native API -Renderscript를 사용하여 Android에서 Gaussian Blur를 구현할 수 있지만 Android의 API는 Android 버전 4.2 인 17 이상입니다.
/** * renderscript * @param bitmap * @return */public bitmap blur (bitmap bitmap)를 사용하여 가우시안 퍼지를 구현하기위한 알고리즘 {// blupbitmap outbitmap = bitmap.createbitmap을 원하는 비트 맵 (bitmap.createbitmap)을 사용하여 빈 비트 맵을 생성하자. bitmap.config.argb_8888); // 새로운 renderscripttrenderscript rs = renderscript.create (getApplicationContext ()); // renderscriptScriptScriptScriptIntrinsicblur blurscript = scriptIntrinsicblur.create (rs, rrs, the thing the the); 렌더 스크립트 및 In/Out BitMapSallocation Allin = allocation.createfrombitmap (rs, bitmap)과 함께 할당 (in/out); 할당 Allout = allocation.createfrombitmap (rs, outbitmap); // blur의 반경 설정 : 0 <radius <25blurscript.setradius (20.0f); // renderscriptBlurscript.setInput (allin); blurscript.foreach (Allout); // OutbitMapallout.copyto (OutbitMap)에 Outallocation으로 생성 된 최종 비트 맵을 복사하십시오. // 원래 BitMapbitMap.Recycle ()를 재활용 한 후 Renderscript.rs.rscript.rs.r renderscript ()를 파괴합니다.우리가 개발 한 이미지 프레임 CV4J는 또한 가우시안 블러를 구현하는 필터를 제공합니다.
GaussianBlurfilter 필터 = New GaussianBlurfilter (); Filter.SetSigma (10); rxImagedata.bitMap (BitMap) .addFilter (필터) .into (image2);
CV4J에서 구현 된 가우스 퍼지는 렌더 스크립트 구현의 효과와 일치한다는 것을 알 수 있습니다.
그중 GaussianBlurfilter의 코드는 다음과 같습니다.
공개 클래스 GaussianBlurfilter는 CommonFilter를 구현합니다 {개인 float [] 커널; 개인 Double Sigma = 2; ExecutorService Mexecutor; Publicervice <void> 서비스; public gaussianblurfilter () {Kernel = new float [0];} public void setsigma (double a) {thisgma = a; ImageProcessor Src) {최종 int width = src.getWidth (); 최종 int height = src.getheight (); 최종 int size = width*height; int dims = src.getchannels (); MakeGaussianKernel (Sigma, 0.002, (int) math.min (width, height)); taskUtils.newfixedthreadpool ( "cv4j", dims); service = new ExecutorCompletionService <> (mexecutor); // resultfor (int i = 0; i <dims; i ++) {final int temp = i; service.submit (new Callable <void> () {public void call () {infix = [) {byte [) src.tobyte (temp); byte [] temp = new byte [size]; blur (inpixels, temp, 너비, 높이); // h Gaussianblur (Temp, Inpixels, height, width); // v Gaussainreturn null;}}); (InterpruptedException e) {e.printstacktrace ();}} mexecutor.shutdown (); return src;}/** * <p> 여기에는 1d Gaussian, </p> * * * @param inpixels * @param outpixels * @param width * @param height */private void blur (intpix, infix, inpix, infix, infix []). 너비, int 높이) {int subcol = 0; int index = 0, index2 = 0; float sum = 0; int k = kernel.length -1; for (int row = 0; row <height; row ++) {int c = 0; index = row; for (int col = 0; col <width; col ++) {sum = 0; for (int m = -k; m; if (subcol <0 || subcol> = width) {subcol = 0;} index2 = row * width +subcol; c = inpixels [index2] & 0xff; sum += c * 커널 [math.abs (m)];} outpixels [index] = (byte) 도구 (sum); void}}}}}}}}}}}}} MakeUssianKernel (최종 이중 시그마, 최종 이중 정확도, int maxradius) {int kradius = (int) math.ceil (Sigma*Math.sqrt (-2*math.log (Accuracy)))+1; (Maxradius <50) Maxrius = 50; // 너무 작은 MaxRadius가 Inccaturation Sum.if. kradius = maxradius; kernel = new float [kradius]; for (int i = 0; i <kradius; i ++) // gaussian functionkernel [i] = (float) (math.exp (-0.5*i*i/sigma/sigma); 커널 [0]; for (int i = 1; i <kradius; i ++) sum+= 2*커널 [i];} else sum = sigma*math.sqrt (2*math.pi); for (int i = 0; i <kradius; i ++) {double v = (kernel [i]/sum); 커널 [i] = (float) v;} return;}}우주 컨볼 루션
2 차원 컨볼 루션은 이미지 처리에서 종종 발생하며, 대부분의 개별 형태의 2 차원 컨볼 루션은 이미지 처리에 사용됩니다.
다음은 CV4J가 구현 한 다양한 컨볼 루션 효과입니다.
CV4J는 현재 다음과 같은 공간 컨볼 루션 필터를 지원합니다
| 필터 | 이름 | 효과 |
|---|---|---|
| Convolutionhvfilter | 회선 | 흐림 또는 소음 감소 |
| MinmaxFilter | 최대 및 최소 필터링 | 비난 |
| SapnoiseFilter | 소금과 후추 소음 | 소음을 늘리십시오 |
| 샤프 필터 | 갈다 | 향상되었습니다 |
| 메디마 필터 | 중간 필터링 | 비난 |
| Laplasfilter | 라플라스 | 가장자리 추출 |
| findedgefilter | 가장자리를 찾으십시오 | 그라디언트 추출 |
| Sobelfilter | 구배 | X 및 Y 방향으로 그라디언트 추출을 받으십시오 |
| 분산 필터 | 분산 필터링 | 고역 통과 필터링 |
| MaeroperatorFilter | 3 월 운영 | 고역 통과 필터링 |
| USMFILTER | USM | 향상되었습니다 |
CV4J는 Gloomyfish와 I가 개발 한 이미지 처리 라이브러리이며 여전히 초기 버전입니다.
현재 구현 된 기능 :
이번 주, 우리는 CV4J를 크게 조정하고 전체 아키텍처를 최적화했습니다. 공간 컨볼 루션 기능 (이미지 향상, 선명도, 흐림 등)도 추가됩니다. 다음으로 이진 이미지 분석 (부식, 확장, 개방 및 마감 작업, 컨투어 추출 등)을 수행합니다.
요약
위의 것은 가우시안 블러 및 이미지의 공간 컨볼 루션을 구현하기위한 Java 프로그래밍에 관한이 기사의 모든 내용입니다. 모든 사람에게 도움이되기를 바랍니다. 관심있는 친구들은이 사이트를 계속 참조 할 수 있습니다.
깊은 신경 네트워크 알고리즘 공유를 구현하기위한 70 줄의 Java 코드 라인
Java 언어
빨간색과 검은 색 트리를 구현하기위한 Java 알고리즘의 전체 코드 예제
단점이 있으면 메시지를 남겨 두십시오. 이 사이트를 지원해 주신 친구들에게 감사드립니다!