OpenCV를 이용하여 캠 스캐너와 같은 매직 컬러 효과를 얻는 방법
이게 원래 이미지입니다.
이미지에 대한 내 필터.
이미지의 콘트라스트를 변경하고 있습니다.
dst.convertTo(dst, -1, 2, 0);
그런 다음 Gaussian 블러를 사용하여 스무딩을 합니다.
cv::GaussianBlur(dst,result,cv::Size(0,0),3);
cv::addWeighted(dst, 1.5, result, -0.5, 0, result);
제 이미지에 그런 영향을 미치려면 어떻게 해야 할까요?
갱신하다
히스토그램 등화 후 -
vector<Mat> channels;
Mat img_hist_equalized;
cvtColor(dst, img_hist_equalized, CV_BGR2YCrCb);
split(img_hist_equalized,channels);
equalizeHist(channels[0], channels[0]);
merge(channels,img_hist_equalized);
cvtColor(img_hist_equalized, img_hist_equalized, CV_YCrCb2BGR);
캠스캐너 애플리케이션은 다양한 번개 케이스 등을 처리하기 위해 복잡한 알고리즘을 사용하고 있을 수 있습니다.하지만 이러한 문제에 대한 기본적인 접근 방법을 다루려고 합니다. 여기서의 기본 아이디어는 주어진 입력 이미지를 이진화하는 것입니다. 또는 더 정확하게 말하면 주어진 이미지를 유지하는 것입니다. OpenCV 문서를 보면 주어진 이미지를 임계값화하는 것에 대한 참조가 많습니다. 따라서 문서부터 시작하겠습니다.
전역 임계값:이 접근법에서 우리는 전경의 세기 값이 항상 특정 값 이하라고 가정합니다. 인쇄된 시트의 맥락에서 우리는 잉크 색이 항상 검은색이고 종이 색이 균일하며 잉크 색의 세기보다 세기가 크다고 가정합니다. 그래서 우리는 안전하게 몇 가지 임계값(예: 40)을 가정합니다.는 255)이고 입력 이미지를 다음과 같이 임계값으로 지정합니다.
ret, thresh1 = cv2.threshold(img, 100, 255, cv2.THRESH_BINARY)
ret, thresh1 = cv2.threshold(img, 130, 255, cv2.THRESH_BINARY)
There are many disadvantages to this method, First of all it is **NOT** independent of intensity variance, So there is a very less chance that you can accurately estimate a threshold value which segments text from the given image, It has very limited applications, can be only applied in case where the background paper is exactly white with minimum variation in intensity, so this process cannot be used for **Real world** images.
적응형 임계값:이 방법은 주어진 이미지의 강도 변화 문제를 다루며, 여기서 임계값은 주변 픽셀의 값에 대해 수행되므로, 낮은 강도에서 높은 강도로 또는 그 반대로 전환되는 것은 다음과 같이 성공적으로 캡처됩니다.
thresh = cv2.adaptiveThreshold(original_img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)
*Further Work*: You may work on various techniques of denoising the binary image, to remove the dots, Or have a look at removing the salt and pepper noise from the image.
Otu의 이진화:이 방법은 임계값을 지능적으로 계산하는 또 다른 좋은 방법입니다. 일부 경우에는 매우 잘 작동할 수 있지만 사용자의 경우에는 실패하는 것 같습니다.
ret2,thresh = cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
기본적으로 동일한 전역 임계값을 수행하지만 이제 임계값은 자동으로 계산되어 임계값이 2개의 피크 사이에 있으므로 용지에서 잉크를 분할합니다.
권장 방법:가장 좋은 방법은 Adaptive Thresholding(적응적 임계값)이라고 생각합니다. 영상을 선명하게, 히스토그램 균등화 등과 같은 다른 전처리 기술을 시도하고 분석할 수 있습니다. 어떻게 하면 더 사실적인 출력을 생성할 수 있는지 분석할 수 있습니다. 영상 노이즈 제거, 형태학적 작업과 같은 후처리를 시도할 수도 있습니다.
이미지 노이즈 제거를 시도해보니 다른 방법보다 효과적이었습니다.
denoised = cv2.fastNlMeansDenoising(thresh, 11, 31, 9) # you may experiment with the constants here
그러나 위의 접근 방식을 다양하게 조합하여 어떤 방식이 모든 경우에 적합한지 확인해 보는 것을 환영합니다.
참고: 위의 기술은 덜 화려한 이미지에 적용될 수 있습니다.하지만 컬러 이미지의 경우를 해결할 수 있는 또 다른 훌륭한 답이 있습니다.
이러한 유형의 이미지를 처리하는 매우 간단하지만 효과적인 방법 중 하나는 플랫 필드 보정입니다.
"" 합니다를 합니다.F
원본 이미지에 매우 강한 블러 필터를 적용하여I
곱하기 .I
F
를 , 나눕니다.F
로)다를 .C
은 전체적인 곱셈은 전체적인 밝기를 유지하기 위한 것이고, 나눗셈은 마법이 일어나는 곳입니다.
기본적으로 다음과 같습니다.C = (I * mean(F)) / F
C
전부는 아닐지라도 대부분의 원치 않는 대규모 조명과 색상을 제거할 것입니다.그러면 조영제를 조금만 더 늘리면 제공된 참조 이미지와 매우 유사한 결과를 얻을 수 있습니다.(gray 스케일, 고대비, 임계값은 아님)
제공된 이미지에 대한 결과가 어떻게 되는지 궁금하다면...
첫째, 플랫 필드:
그런 다음 보정된 이미지:
그리고 마지막으로 대비를 높인 후:
이것의 가장 어려운 부분은 평평한 필드를 올바르게 만드는 것입니다. 텍스트를 제거할 수 있을 정도로 흐리게 하면서 동시에 배경을 최대한 보존하려는 것입니다.이 경우 비선형 필터(예: 중앙값)가 도움이 될 수 있습니다.
저는 포토샵을 이용하여 스캔 효과를 얻기 위해 필요한 편집 기법을 알아냈습니다.
포토샵에서 스캔 효과는 "수준" 기능이 제공하는 "set white point" 및 "set black point" 연산을 사용하여 얻을 수 있습니다.이 두 가지 작업을 결합하면 다양한 모바일 앱에서 종종 "마법의 색"으로 간주되는 스캔 효과가 발생합니다.
이 외에도 하이패스 필터는 그림자 제거와 같은 흥미로운 결과를 얻기 위해 위의 두 가지 작업과 함께 사용할 수 있습니다.
"Black & White" 모드의 문서 스캔은 OpenCV를 사용하여 LAB 색 공간에서 이미지를 처리함으로써 이루어집니다.
위에 언급된 동작들은 다양한 임계값 기법들 및 소수의 기본 수학적 동작들을 사용하여 OpenCV에서 구현될 수 있습니다.
이 저장소를 한 번 살펴보시면 제가 말하고자 하는 내용을 완벽하게 파악하실 수 있습니다.
위 레포에 프로젝트에 대한 전체 위키 문서를 추가하였습니다.
이 답변은 별로 유익하지 않은 것 같지만 레포가 정교한 논의를 해주기 때문에 저는 이 게시물을 짧게 유지하고 있습니다.
다음과 같은 기법을 사용하여 달성할 수 있는 결과의 예:
이 이미지의 표시는 GitHub 레포에서 논의된 각 모드의 출력 유형을 이해하는 데 도움이 됩니다.
OpenCV에서는 아니지만, 이런 종류의 작업을 수행하는 코드를 작성했습니다.
일반적으로 히스토그램을 분석하여 히스토그램을 기준으로 "흰색"과 "검은색"이 무엇인지 추정한 다음, 검은색이 0 미만으로, 흰색이 1 이상(또는 표현에 따라 255)이 되도록 이미지 값을 조정하여 최종적으로 색상 값을 클램핑합니다.
하지만 OpenCV를 사용하면 더 간단한 방법이 있을 수 있습니다.대비 필터를 적용하기 전에 잘라낸 페이지에서 히스토그램 균등화를 사용하여 대비를 조정하면 더 많은 상황에서 안정적으로 작동할 수 있도록 픽셀 값을 보다 일관된 방식으로 분산시킬 수 있습니다.지역화된 히스토그램 균등화를 사용하여 조명으로 인해 잘라낸 이미지의 그라디언트를 완화할 수 있지만, 이로 인해 페이지의 빈 영역에 문제가 발생할 수 있습니다.
게임에 조금 늦었다는 것을 깨달았지만, 놀랍고 간단한 해결책을 발견했습니다.
src.convertTo(dst, -1, 1.9, -80);
처리 파이프라인에서 작업하는 경우 src와 dst는 동일한 이미지가 될 수 있습니다.
언급URL : https://stackoverflow.com/questions/32913157/how-to-get-magic-color-effect-like-cam-scanner-using-opencv
'programing' 카테고리의 다른 글
Wordpress 3.0에서 Custom post_type Permalinks에서 날짜 사용 (0) | 2023.10.02 |
---|---|
길이가 변경된 10진수 값에서 후행 0 제거 (0) | 2023.10.02 |
php const 배열 (0) | 2023.09.27 |
PHP와 C의 가변 스코프 차이: 블록 스코프가 완전히 같지는 않습니까? (0) | 2023.09.27 |
XElement의 아이들 (0) | 2023.09.27 |