24 비트 컬러 다이어그램 및 8 비트 그레이 스케일 다이어그램
먼저 24 비트 컬러 이미지를 소개하겠습니다. 24 비트 컬러 이미지에서, 각 픽셀은 3 바이트로 표시되며, 일반적으로 RGB로 표현됩니다. 일반적으로, 많은 24 비트 컬러 이미지는 32 비트 이미지로 저장되며 픽셀 당 초과 바이트는 alpha 값으로 저장되어 특수 영향 정보를 보여줍니다 [1].
rgb 모델에서 r = g = b이면 색상은 회색 색상을 나타내며 r = g = b의 값을 회색 값이라고합니다. 따라서 그레이 스케일 이미지의 각 픽셀은 그레이 스케일 값 (강도 값과 밝기 값이라고도 함)을 저장하기 위해 하나의 바이트 만 필요하며, 그레이 스케일 범위는 0-255입니다 [2]. 이것은 당신에게 그림의 회색 스케일 사진을 제공합니다.
그레이 스케일의 몇 가지 방법
1. 구성 요소 방법 : 세 가지 RGB 구성 요소 중 하나를 그레이스 스케일 맵의 회색 값으로 사용하십시오.
2. 대부분의 값 방법 : 세 가지 RGB 구성 요소의 최대 또는 최소값을 GrayScale 맵의 회색 값으로 사용하십시오.
3. 평균 방법 : 세 가지 RGB 구성 요소의 평균값을 그레이 스케일 그래프의 회색 값으로 사용하십시오.
4. 가중치 방법 : 인간의 눈의 색상 감도가 다르기 때문에 RGB 3 개 성분의 가중 평균은보다 합리적인 회색조 이미지를 얻을 수 있습니다. 일반적인 상황은 다음과 같습니다. y = 0.30r + 0.59g + 0.11b.
[참고] 가중치 방법은 실제로 그림의 밝기 값을 그레이 스케일 값으로 계산하고 YUV 모델을 사용합니다. [3]에서, 저자는 y = 0.21 * r + 0.71 * g + 0.07 * b를 사용하여 그레이 스케일 값을 계산한다는 것을 알게 될 것입니다 (분명히 세 가지 가중치의 합은 1과 같지 않아 저자의 실수 일 수 있습니까?). 실제로이 차이는 감마 보정이 사용되는지 여부와 관련이 있어야합니다 [1].
Java에서 그레이 스케일을 구현하는 방법
"Java Pempess Grayscale"을 검색하면 대부분의 방법 (코드)입니다.
public void grayimage ()는 ioexception {file file = new File (System.GetProperty ( "user.dir")+"/test.jpg"); BufferedImage image = imageio.Read (파일); int width = image.getWidth (); int height = image.getheight (); BufferedImage GrayImage = 새로운 BufferedImage (너비, 높이, BufferedImage.type_byte_gray); for (int i = 0; i <width; i ++) {for (int j = 0; j <height; j ++) {int rgb = image.getrgb (i, j); GrayImage.setrgb (i, j, rgb); }} 파일 newFile = 새 파일 (System.GetProperty ( "user.dir")+"/method1.jpg"); imageio.write (Grayimage, "JPG", NewFile); }test.jpg의 원본 이미지는 다음과 같습니다.
위의 방법을 사용하여 얻은 그레이 스케일 다이어그램 :
이 그레이 스케일 이미지를 보는 것은 실현 가능한 것 같습니다. 그러나 우리가 opencv 사용하여 그레이 스케일을 달성하거나 PIL (Python)을 사용하는 경우 그 효과가 크게 다르다는 것을 알 수 있습니다.
img = cv2.imread ( 'test.jpg', cv2.imread_color) 그레이 = cv2.cvtcolor (img, cv2.color_bgr2gray) cv2.imwrite ( 'pythonmethod.jpg', Grey)
opencv 사용하여 얻은 그레이 스케일 그래프 (PIL에 대해서도 동일)가 위의 Java 방법에 의해 얻은 방법보다 훨씬 낫다는 것을 분명히 알 수 있으며, 많은 세부 사항을 볼 수 있습니다. 이것은 인터넷 에서이 인기있는 방법에 항상 문제가 있었지만 무시되었다는 것을 보여줍니다.
OpenCV에서 그레이 스케일을 달성하는 방법
opencv 와 관련된 책이나 코드를 읽은 경우 opencv Grayscale에 가중치가 가중치를 사용한다는 것을 알 수 있습니다. 그 이유는 opencv Grayscale 이미지가 왜 그렇게 좋은지 모르기 때문입니다. 우리가 무시할 다른 처리 세부 사항이 있습니까?
우리의 추측을 확인하는 것은 매우 간단합니다. 픽셀 값이 회색으로 나오기 전후 변경 사항을 확인하십시오. 다음과 같이 테스트 할 수 있습니다.
img = cv2.imread ( 'test.jpg', cv2.imread_color) h, w = img.shape [: 2] grey = cvtcolor (img, cv22.color_bgr2gray) 범위 (h) : IN PRANT STR (i) + ":" + str (j) + ""] IMG [H-1] [W-1] [0 : 3]
아래의 많은 픽셀을 판단하기는 어렵지만 마지막 픽셀 포인트에주의를 기울이기 만하면 단서를 찾을 수 있습니다. 원본 이미지의 마지막 픽셀 포인트의 RGB 값은 44, 67, 89이며, 회색 후 값은 71입니다. 이전에 Java에서 회색으로 연결된 이미지의 픽셀 값을 확인하면 픽셀 값 이이 공식을 충족하지 않을뿐만 아니라 서로가 멀다는 것을 알 수 있습니다.
이 시점에서 OpenCV (PIL 포함)는 가중치 방법을 사용한 회색의 구현이라고 생각합니다.
Java는 가중 방법 회색조를 구현합니다
인터넷에서 인기있는 방법이 작동하지 않는다면 어떻게 Gayscale을 달성하기 위해 Java를 사용해야합니까? 실제로, [3]은 성공적으로 달성했습니다 (다중 방법) 회색 스케일 (외국 친구는 여전히 기술이 매우 강력합니다). 여기에서 필요한 코드 만 추출됩니다.
개인 정적 int colortorgb (int alpha, int red, int green, int blue) {int newpixel = 0; NewPixel += 알파; NewPixel = NewPixel << 8; NewPixel += 빨간색; NewPixel = NewPixel << 8; NewPixel += 녹색; NewPixel = NewPixel << 8; NewPixel += 파란색; NewPixel을 반환합니다. } public static void main (string [] args)은 ioexception {bufferedimage bufferedimage = imageio.read (system.getProperty ( "user.dir" + "/test.jpg"); bufferedImage grayimage = new bufferedimage (bufferedimage.getwidth () bufferedImage.getType ()); 0xff; int Grey = (int); file (system.getProperty ( "user.dir") + "/ok.jpg"); 위의 코드는 회색 규모 픽셀 값을 인쇄합니다. 위의 Python 코드와 비교하면 픽셀 값이 완전히 대응합니다. colorToRGB 메소드는 색상 다이어그램을 정확히 4 바이트로 처리하며 그 중 하나는 alpha 매개 변수입니다 (앞에서 언급 한). 다음 그림은이 코드의 회색차 이미지입니다.
다른 방법의 경우, 동일하게 얻을 수 있습니다.
요약
이 기사의 이유는 Java를 사용하여 여러 그레이 스케일 작업을 구현하고 OpenCV를 사용하여 변환의 올바른 또는 잘못을 확인하기 때문입니다. 그러나 실제 테스트에서 일부 문제가 발견되었습니다 (변환 된 그림에는 차이가 있으며 변환 후 회색차 값을 기반으로 회색체 이미지를 생성하는 방법)이 발견되었으며, 이에 대한 생각과 검증이 이루어졌습니다. 여기서 인터넷의 일부 기사는 다소 추가 사고를 수행하고 있으며, 그 중 다수는 특히 국내 기사도 복사되어 있음)에 주목해야하며, 이러한 실제 문제에 대해서는 실습 구현 및 검증이 매우 중요한 방법입니다. 이 기사의 내용이 모든 사람에게 도움이되기를 바랍니다. 궁금한 점이 있으면 메시지를 남겨 두십시오.