@@ -26,6 +26,25 @@ def read_channel_data_from_img(filename: str, channel: int) -> np.ndarray:
2626 channel_array = _read_channel_data_from_raw_file (filename , channel )
2727 return channel_array
2828
29+ def read_img_array_from_img (filename : str , channel : int ) -> np .ndarray :
30+ """
31+ Returns a 2D array of the image for all color channels.
32+
33+
34+ :param filename: The path of the image file to read.
35+ :type filename: str
36+ :param channel: The color channel used for calculating black level values.
37+ :type channel: int
38+ :return: A 2D array containing the processed image data for all color channels.
39+ :rtype: np.ndarray
40+ """
41+ extension = os .path .splitext (filename )[- 1 ]
42+ if extension in ['.JPG' , '.JPEG' , '.jpg' , '.jpeg' , '.PNG' , '.png' ]:
43+ img_array = _read_grayscale_img_array_from_img_file (filename )
44+ elif extension in ['.CR2' , '.CR3' ]:
45+ img_array , _ = _read_img_array_from_raw_file (filename , channel )
46+ return img_array
47+
2948
3049def _read_channel_data_from_img_file (filename : str , channel : int ) -> np .ndarray :
3150 """
@@ -38,7 +57,7 @@ def _read_channel_data_from_img_file(filename: str, channel: int) -> np.ndarray:
3857 :return: A 2D numpy array containing the data of the specified color channel from the image.
3958 :rtype: np.ndarray
4059 """
41- img_array = read_img_array_from_img_file (filename )
60+ img_array = _read_img_array_from_img_file (filename )
4261 return img_array [:, :, channel ]
4362
4463
@@ -54,15 +73,15 @@ def _read_channel_data_from_raw_file(filename: str, channel: int) -> np.ndarray:
5473 :return: A 2D numpy array representing the extracted channel, with all other channel values masked or set to zero.
5574 :rtype: np.ndarray
5675 """
57- img_array , filter_array = read_img_array_from_raw_file (filename , channel )
76+ img_array , filter_array = _read_img_array_from_raw_file (filename , channel )
5877 if channel == 0 or channel == 2 :
5978 channel_array = np .where (filter_array == channel , img_array , 0 )
6079 elif channel == 1 :
6180 channel_array = np .where ((filter_array == 1 ) | (filter_array == 3 ), img_array , 0 )
6281 return channel_array
6382
6483
65- def read_img_array_from_raw_file (filename : str , channel : int ) -> np .ndarray :
84+ def _read_img_array_from_raw_file (filename : str , channel : int ) -> np .ndarray :
6685 # TODO: channel is only relevant for black level, consider individually!
6786 with rawpy .imread (filename ) as raw :
6887 data = raw .raw_image_visible .copy ()
@@ -74,10 +93,16 @@ def read_img_array_from_raw_file(filename: str, channel: int) -> np.ndarray:
7493 img_array = np .clip (img_array , 0 , white_level )
7594 return img_array , filter_array
7695
77- def read_img_array_from_img_file (filename : str ) -> np .ndarray :
96+ def _read_img_array_from_img_file (filename : str ) -> np .ndarray :
7897 img_array = plt .imread (filename )
7998 return img_array
8099
100+ def _read_grayscale_img_array_from_img_file (filename : str ) -> np .ndarray :
101+ img_array = plt .imread (filename )
102+ weights = np .array ([0.2989 , 0.5870 , 0.1140 ])
103+ gray = np .dot (img_array [..., :3 ], weights ).astype (np .uint8 )
104+ return gray
105+
81106
82107def get_exif_entry (filename : str , tag : str ) -> str :
83108 """
0 commit comments